排序时间差异

时间:2015-03-08 01:24:11

标签: java arrays algorithm sorting analysis

我为学校作业编写了一个程序,它打印出使用六种不同排序算法对整数数组进行排序所需的时间:选择排序,冒泡排序,合并排序,快速排序,堆排序和基数排序。整数数组的范围为50,000到300,000个元素。

令我困扰的是合并排序,堆排序,基数排序和Collections.sort()方法的第一个结果。

第一个数组50,000元素数组的排序时间比后续的较长数组要长。正如我所料,每个后续的较大阵列需要花费越来越多的时间进行排序。我想知道是什么造成了这种情况,是否是我不考虑的开销或我的算法或程序是否存在问题。

我附加了显示结果的screenshot链接

以下是代码

的示例
    int[] array = generateIntegers(50000);
    long start = System.currentTimeMillis();
    radixSort(array);
    long end = System.currentTimeMillis();
    System.out.println(end - start);

    int[] arrayTwo = generateIntegers(100000);
    start = System.currentTimeMillis();
    radixSort(arrayTwo);
    end = System.currentTimeMillis();
    System.out.println(end - start);

    int[] arrayThree = generateIntegers(150000);
    start = System.currentTimeMillis();
    radixSort(arrayThree);
    end = System.currentTimeMillis();
    System.out.println(end - start);

控制台:

    40
    10
    13

generateIntegers(n)方法

public static int[] generateIntegers(int size)
{
    int[] arr = new int[size];

    Random rand = new Random();
    for (int i = 0; i < size; i++)
        arr[i] = rand.nextInt(integerRange);
    return arr;
}

感谢您的任何意见!

1 个答案:

答案 0 :(得分:3)

正确测量java程序的性能是非常复杂和困难的,特别是当您想要比较不同的算法时,由于JVM在执行期间进行了许多聪明的优化(例如,请参阅Wikipedia: Java performance - Adaptive optimization)。 / p>

一个主要规则是执行&#34; JVM热身&#34;在测量之前。这使JVM有时间学习&#34;关于您的代码以及如何使用它(执行配置文件)来优化它。然后你应该计算几次执行的平均执行时间值。

您的绩效衡量方法可能如下:

public long measure(Runnable testCode, int warmupIterations, int testIterations) {
    // warmup
    for(int i = 0; i < warmupIterations; i++) {
        testCode.run();
    }

    // test
    long time = System.currentTimeMillis();
    for(int i = 0; i < testIterations; i++) {
        testCode.run();
    }
    long elapsed = System.currentTimeMillis() - time;

    return elapsed / testIterations;
}