插入排序平均情况给出n而不是n ^ 2,除非是非常大的数组大小

时间:2017-02-11 00:18:03

标签: java algorithm performance big-o insertion-sort

我对插入排序和测试/实现它的平均情况有疑问。

据我所知它的意思是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

2 个答案:

答案 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的线性时间算法。

这就是为什么你的时间比你想象的更平坦。