迭代(基于堆栈)快速排序比递归更快吗?

时间:2014-07-15 05:21:51

标签: optimization recursion quicksort

在各个地方,我看到过声称使用堆栈实现快速排序比使用递归更快。这是真的?我知道编译器通常擅长将递归更改为迭代,但链接到的页面上的注释声称它太复杂而无法优化。

快速排序还有哪些其他优化措施?

以下是我认为迭代实现优于递归实现的一些地方: http://www.geeksforgeeks.org/iterative-quick-sort/

  

尽管有上述优化,但该函数仍然是递归和使用的   函数调用栈用于存储l和h的中间值。该   函数调用栈与其他簿记信息一起存储   参数。此外,函数调用涉及存储等开销   激活记录调用者函数,然后恢复执行。

     

上面的函数可以很容易地转换为迭代版本   辅助堆栈的帮助。

Quicksort : Iterative or Recursive

  

我了解到递归算法总是比它们慢   迭代对应物。
  然而,答案指出这并不总是正确的,虽然我不明白为什么因为在系统堆栈上存储函数状态所涉及的开销的参数。

使用显式堆栈和迭代代替递归实现的优点基本上是三方面的:

http://www.codeproject.com/Articles/23196/Iterative-Quick-Sort

Using an explicit stack allows the sort to avoid the temporary storage of unnecessary information.
Rather than placing two partitions on a stack in arbitrary order, as a typical recursive Quicksort would implicitly do, the sizes of the
     首先检查

分区,指示较大的分区   两者堆叠在一起。较小的分区指针不会堆叠   在所有:我们能够做到这一点,因为我们可以保证更小   分区总是等于第二次递归调用,   这是函数的尾端。这导致第三个   优点:       可以消除任何尾端递归,并用简单的循环替换。

Comment on codereview

  

由于递归而无法扩展:JVM没有尾调用   优化,它只会将方法调用堆栈增长到某种程度   与要排序的数组成比例,并且它会因为太大而失败   阵列。 (甚至对于有尾调用的语言/平台   优化我不认为他们能够实际应用它   代码)

还有相当多的基于堆栈/迭代实现的快速排序here,但我想编码器只是为了好玩而这样做了?

2 个答案:

答案 0 :(得分:1)

你给我们的链接并没有说在Java中使用堆栈更快,它说JVM会为一个大的排序数组堆栈溢出。顺便说一句,大多数(所有?)递归都是用堆栈实现的。

请提供正确的链接,指向解释为什么堆栈比递归更快的参数。没有这个我们就无法回答。

答案 1 :(得分:0)

递归算法几乎总是基于堆栈:它们使用"调用堆栈",仅在尾递归的情况下,最后的调用记录将被覆盖。使用递归的潜在优化是增加调用堆栈是单个CPU指令。因此,当涉及硬件支持时,有时递归算法会更快。

在大多数情况下,您可以优化堆栈(例如,因为某些参数(如要排序的数组仍然相同,或者因为只有一个返回地址)。如果是这种情况,显式堆栈可以更快。

有些编译器会尝试自己优化递归算法。但正如在几乎所有优化案例中一样:它不可判定哪种算法会更快。