【发布时间】:2014-10-18 09:19:14
【问题描述】:
我听说在快速排序中,最好先在较小的子数组上调用递归。例如,如果5 是主元,并且数据被排序到4,1,3,5,7,6,那么最好先对子数组7,6 进行排序,因为它包含两个元素,而4,1,3 包含三个元素。
The source of all knowledge 给出了快速排序的伪代码
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
因此,首先实现在较小数组上递归的算法看起来像
quicksort(A, i, k):
if i < k:
p := partition(A, i, k)
if(p-i > k-p)
/*difference from start point to pivot is greater than
difference from pivot to end point*/
quicksort(A, p + 1, k)
quicksort(A, i, p - 1)
else
quicksort(A, i, p - 1)
quicksort(A, p + 1, k)
我分析了这样用 Java 编写的代码,它看起来确实更快,但为什么呢?起初我以为它与尾递归优化有关,但后来意识到这是错误的,因为 Java 不支持它。
为什么首先对较小子数组中的代码进行排序更快? This article 声称应该是
【问题讨论】:
-
那篇文章并没有说我可以看到它更快。它只是说如果您使用尾递归,它将最小化堆栈深度。
-
链接的文章讨论了堆栈的使用。我错过了那里关于速度的讨论吗?如果是,请添加文章中的引用以使您的问题更清楚。
-
你在维基百科上查过快速排序吗?它很好地分析了 Quicksort 的运行时间(提示它试图减少所需的比较次数)。
-
想展示您使用的基准吗?另外,您statistically prove 是否声称递归顺序很重要?
-
@MooingDuck 也许我就是这么想的,如果你可以循环一个为什么你不能循环另一个?
标签: algorithm sorting recursion