排序时间总是与第一次排序不同

时间:2017-03-24 15:29:00

标签: java sorting time-complexity

我写了几个排序算法。我想比较他们的排序时间,至少差不多。但是在第一次循环之后,所有排序时间都会减少,除了StoogeSort。我认为在背景上有所优化,但我应该考虑采取哪些措施?第一个还是其他?为什么会发生这种情况?

    public static void main(String[] args) {
    RandomNumber rn = new RandomNumber();

    Scanner sc = new Scanner(System.in);
    while(true){
        System.out.println("Enter the input size.");
        int n = sc.nextInt();
        int[] experimentalArray = rn.experimentalArrayGenerator(n);



        Stopwatch sw1 = new Stopwatch();
        StoogeSort ss = new StoogeSort(experimentalArray.clone());
        System.out.println("StoogeSort : " + sw1.elapsedTime() + " µs");

        Stopwatch sw2 = new Stopwatch();
        RadixSort rs = new RadixSort(experimentalArray.clone());
        System.out.println("RadixSort : " + sw2.elapsedTime() + " µs");

        Stopwatch sw3 = new Stopwatch();
        ShakerSort shs = new ShakerSort(experimentalArray.clone());
        System.out.println("ShakerSort : " + sw3.elapsedTime() + " µs");

        Stopwatch sw4 = new Stopwatch();
        MaximumSubarray ms = new MaximumSubarray();
        int a = ms.maxSubArraySum(experimentalArray.clone());
        System.out.println("MaximumSubarray : " + sw4.elapsedTime() + " µs");
        System.out.println("------------------------------------------------------");
    }
}

4循环后的输出:

enter image description here

1 个答案:

答案 0 :(得分:1)

微观标记是一个复杂的问题,因为许多因素会影响执行时间(例如Jon Skeet在评论中指出的即时编译和垃圾收集)。

如果你想了解如何接近微基准测试,你应该阅读Peter Sestoft的this document

在此处引用文档的摘要,因为文档是外部资源:

  

有时人们想要衡量软件的速度,例如,   衡量解决问题的新方法是否比旧方法更快   一。进行这样的时间测量和微基准测试需要   非常小心,特别是在像Java这样的托管平台上   虚拟机和Microsoft的公共语言基础结构(.NET),   否则结果可能是任意的和误导性的。

     

我们在这里给出一些   关于运行微基准测试的建议,特别是对于托管的   平台。大多数示例都是Java,但建议适用于任何   在托管平台上执行的语言,包括Scala,C#和F#。   此版本使用Java功能接口,需要Java 8。