测试快速排序的速度

时间:2014-10-03 22:18:39

标签: java algorithm sorting quicksort

我读了算法第4版普林斯顿的书,并观看了在线课程视频。我发现了两件有趣的事情。

  1. 在视频中有人说,如果我们在quicksort中使用这样的截止值,我们会将程序加速10~20%:

    if(hi - lo< CUTOFF)Insertion.sort(a);

  2. 它建议当我们使用递归公式将数组a划分为子数组并递归排序子数组时,我们可以在子数组的大小小于CUTOFF时使用插入排序算法。但是,当我用CUTOFF大小测试它时3,7和10.事实并非如此。它在我的测试数据集中慢了大约10倍。数据集是5000个随机数的数组。所以我想我们最好不要对小尺寸阵列使用插入排序。

    1. 当我尝试测量代码的运行时间并将其与本课程的标准代码(即algs4.jar库)进行比较时。我发现我的时间更长,即使我将代码更改为标准代码。最后,我意识到即使我们快速输出相同的数组两次(将数组复制为a1,a2),第二次排序的运行时间总是大约是第二次排序的运行时间的一半。即(伪代码):      stopWatch sw1 = new stopWatch();      快速排序(A1);      print sw1.elaspedTime();

       stopWatch sw2 = new stopWatch();
       quicksort(a2);
       print sw2.elaspedTime();
      
    2. 然后第二个花费大约一半的时间,即使它们是相同的算法并且排序相同的数组。我不知道为什么会这样。这是一个非常有趣的现象。

1 个答案:

答案 0 :(得分:1)

现在。理论上它可能更快,但根据您使用的语言,编译器,系统,CPU,它可能会有所不同。我可以用你的第二点作为例子。 CPU有一个称为缓存的东西,可以保存频繁使用的数据以提高速度。它非常小但速度超快,比RAM快。所以基本上第一次运行程序时,数组最初是在内存中,当有缓存未命中时它进入缓存。当你第二次运行相同的代码时,一切都在缓存中,没有必要在RAM中查找并且没有缓存未命中,所以它比第一次运行更快。如果你想要准确的结果那么你可能必须清除RAM清除缓存,关闭你正在运行的任何程序等等