快速排序与插入排序的平均时间复杂度

时间:2008-12-12 05:50:35

标签: algorithm sorting

我认为快速排序应该比中等大小的无顺序int数组上的插入排序更快。我在java中实现了这两种算法,我注意到quicksort比插入sorrt慢得多。

我有一个理论:quiksort正在变慢,因为它是递归的,并且它在JVM中调用它自己的方法签名是非常慢的,这就是为什么我的计时器提供比我预期更高的读数,而插入不是递归和所有我们的工作是在一个方法内完成的,所以他们JVM不需要做任何额外的咕噜声工作? amirite?

11 个答案:

答案 0 :(得分:6)

您可能对这些Sorting Algorithm Animations感兴趣。

答案 1 :(得分:2)

可能不会,除非您的递归方法正在进行任何大的分配。它更可能是你的代码中有一个怪癖,或者你的数据集很小。

JVM在递归调用时应该没有任何问题。

答案 2 :(得分:2)

除非您遇到Quicksort的一个病态病例(通常是已经排序的列表),否则Quicksort应该是O(n log n) - 当n增加时,显着快于插入排序的O(n ^ 2)。 / p>

您可能希望使用合并排序或堆排序;他们没有病理病例。它们都是O(n log n)。

(当我很久以前在C ++中使用它时,快速排序比使用相当小的 n s的插入排序更快。对于中等大小的 n ,基数显着更快好。)

答案 3 :(得分:1)

从理论上讲,快速排序应该比中等到大尺寸的随机数据的插入排序更快。

我想差异应该与QS的实施方式有关:

给定数据的枢轴选择?(3-median是一种更好的方法)

使用相同的交换机制进行QS和插入排序?

是输入随机enuf,即,如果你有有序数据集群的性能将是  受到影响。

我在C中进行了这项练习,结果符合理论。

答案 4 :(得分:1)

实际上,对于n值小的插入排序比快速排序更好。至于n的小值而不是n ^ 2或nlogn,时间更多地取决于常数。

答案 5 :(得分:0)

quicksort的最快实现使用循环而不是递归。递归通常不是很快。

答案 6 :(得分:0)

你必须小心如何进行递归调用,因为它是Java,你不能依赖优化的尾调用,所以你应该为递归管理自己的堆栈。

关于快速排序与插入排序有关的所有内容都可以在Bob Sedgewick的博士论文中找到。煮沸的版本可以在他的算法教科书中找到。

答案 7 :(得分:0)

我记得在学校,当我们用Java进行排序时,我们实际上会将两者混合起来。因此对于像quicksort和mergesort这样的resursive算法,我们实际上会对非常小的段进行插入排序,比如10个记录左右。

递归很慢,所以要小心使用它。如前所述,如果你能想出一种以迭代方式实现相同算法的方法,那么就这样做。

答案 8 :(得分:0)

这里有三件事需要考虑。首先,插入排序比快速排序快得多( O(n) vs O(n log n)),如果数据集已经排序,或几乎如此;第二,如果数据集非常小,则设置快速排序的“启动时间”,找到一个支点等等,支配其余部分;第三,Quicksort有点微妙,你可能想重新阅读一夜沉睡后的代码。

答案 9 :(得分:0)

你如何在Quicksort中选择你的支点? 这个简单的事实是你的问题的关键,也可能是Quicksort运行速度慢的原因。在这种情况下,如果您正在寻找一些真正的帮助,最好发布至少代码的重要部分

答案 10 :(得分:0)

实际上,n值插入类型比快速类型更健康。至于n值不大于n ^ 2或nlogn,时间很大程度上取决于常数。 Web Development Indianapolis