我对插入排序和测试/实现它的平均情况有疑问。
据我所知它的意思是n ^ 2,当我做了大约1到200000个充满随机数的数组时,我就得到了。但是现在我正在做20分并计算平均值以确保这个我得到一条直线所以O(n)
然而,当我尝试大小为100,000的数组,从100,000到1,000,000时,我得到一些弯曲的二次线
public static void averageCase() {
for (int x = 10000; x <= 30000; x += 1000) {
int[] averageArray = randomArray(x);
float average = 0;
for (int i = 1; i <= 100000; i++) {
float startTime = System.nanoTime();
insertionSort(averageArray, averageArray.length);
float estimateTime = System.nanoTime() - startTime;
average += estimateTime;
}
System.out.println(average/100000);
}
}
public static int[] randomArray(int n) {
Random random = new Random();
int[] randomArray = new int[n];
for (int i = 0; i < randomArray.length; i++) {
randomArray[i] = random.nextInt(1000);
}
return randomArray;
}
结果是:
16504.586
18559.795
20468.203
22083.01
23530.045
25186.795
27179.09
28793.896
30534.533
32149.34
33869.004
35819.355
37539.02
39216.742
40978.35
42551.215
44186.992
46158.316
47584.38
49660.56
51191.48
答案 0 :(得分:0)
记住O(n ^ 2)表示您的上限。插入排序具有线性下限。尝试使用更大的数字和一堆次数。
答案 1 :(得分:0)
在你的内循环中,你反复对同一个数组进行排序,而不是每次都进行随机化。
for (int i = 1; i <= 100000; i++) {
float startTime = System.nanoTime();
insertionSort(averageArray, averageArray.length);
float estimateTime = System.nanoTime() - startTime;
average += estimateTime;
}
由于插入排序在已排序的输入上以线性时间运行,因此您需要测量1/100000的二次时间算法和99999/100000的线性时间算法。
这就是为什么你的时间比你想象的更平坦。