【发布时间】:2014-06-23 09:42:23
【问题描述】:
package com.sort;
public class ArraySel {
private Long[] a;
private int nElems;
public ArraySel(int max)
{
a = new Long[max];
nElems = 0;
}
public void insert(long max)
{
a[nElems] = max;
nElems++;
}
public void display()
{
for(int j = 0; j < nElems; j++)
{
System.out.print(a[j]+ " ");
}
System.out.println();
}
public void insertionSort()
{
int in , out, flag = 0;
long temp;
for(out = 1; out < nElems; out++)
{
temp = a[out];
in = out;
while(in > 0 && a[in - 1] >= temp )
{
if(a[in] == a[in - 1 ])
{
flag++;
in--;
}
else
{
a[in] = a[in-1];
in--;
}
}
a[in] = temp;
}
}
}
此代码采用未排序的数组并使用插入排序对其进行排序。
当重复项以未排序的数组排列在一起时,由于多次移位的复杂性提高到O(N^2),我试图通过确保在重复排列在一起的情况下没有项目移动超过一次来实现O(N)。
但是当重复项没有排列在一起时,复杂性仍然存在O(N^2)。
在这种情况下我们也可以制作复杂的O(N) 吗?
【问题讨论】:
-
"当重复项在未排序的数组中排列在一起时,由于多次移位,复杂性会提高到 O(N2) ,我试图通过确保没有项目移动超过一次来使其成为 O(N)重复排列在一起的情况。” - 如果输入数组中的元素未排序,则复杂度仍为 O(n^2),无论重复项是否相互跟随。示例 - 5,2,2,1,6 仍然具有复杂度O(n^2)
-
如果我没记错的话,插入排序时间复杂度总是 O(N^2)
-
@Kartik_Koro - 如果输入数组已排序,则插入排序的最佳情况复杂度变为 O(n)
-
@TheLostMind 我知道,但我们在谈论大 O 表示法,即上限对吗?
-
@Kartik_Koro 是的。排序数组的时间复杂度为 O(n)。这意味着对于排序数组,时间不能超过 (someConstant * n)。我们仍在设置上限。
标签: java sorting insertion-sort code-complexity