在不同的地方我看到声称使用堆栈实现快速排序比使用递归更快。这是真的?我知道编译器通常擅长将迭代更改为迭代,但链接到声明的页面上的注释太复杂,无法优化。迭代(基于堆栈)快速排序比递归更快吗?
quicksort还有哪些其他优化?
这里有一些地方,我红认为itterative实现比递归的要好: 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
分区被检查第一和指示所述指针较大的 这两个堆叠。由于我们可以保证较小的 分区总是等于函数尾部的第二个递归调用 ,所以我们可以做到这一点。这导致第三个 的优势: 任何尾端递归都可以被消除并用一个简单的循环代替。
它不能扩展,由于递归:在JVM没有尾巴电话 优化,它只会增加方法调用堆栈成正比阵列东西 进行排序,并将失败太大的数组。(甚至对于语言/平台,确实有尾调用 优化,我不认为他们会能够真正应用到这个 代码)
也有基于相当多的堆栈/迭代实现快速排序here,但我想编码器只是为了好玩而这么做的?
你的基准测试告诉你什么? –
比较苹果和橘子?你不是指迭代还是递归? – leppie
@MarkRansom我的大脑告诉我,这是一种离开后者基准的情况,并在随机散列代码并将其关入基准测试程序之前给出一些理论思考。 – Celeritas