Ste*_*sop 21
这是来自BSD的版本,版权所有Apple,可能在某些时候在OS X中使用:
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/kern/qsort.c
Blindy解释说,虽然递归深度的上限很小,但它是调用递归的.
这是glibc的一个版本,可能在某些时候在Linux系统中使用:
http://www.umcs.maine.edu/~chaw/200801/capstone/n/qsort.c
这不是递归的呼叫.出于与调用递归限制相同的原因,它可以使用少量固定数量的堆栈来管理其循环递归.
我可以查看最新版本吗?不 ;-)
对于几十万个数组元素,即使是调用递归实现也不会调用超过20个级别.在一个不太深入的宏观方案中,除了非常有限的嵌入式设备之外,它们没有足够的内存让你有一个大的排序数组.当N在上面有界时,O(log N)显然是一个常数,但是它通常是一个可管理的常数.通常32或64倍"小"是"合理的".
Bli*_*ndy 11
你知道,递归部分是登录深度.在64级递归(大约64*4 =〜256字节的堆栈)中,你可以对一个大小为~2 ^ 64的数组进行排序,即在64位cpu上可以寻址的数组,即147573952589676412928 64位整数的字节数.你甚至不能把它放在记忆中!
担心重要的东西.
小智 9
是的,它是递归的.不,它可能不会使用大量的堆栈.为什么不试试呢?递归不是某种忌 - 它是许多问题的首选解决方案.
正确实现qsort
不需要超过 log2(N) 级的递归(即堆栈深度),其中 N 是给定平台上的最大数组大小。请注意,无论分区的好坏如何,此限制都适用,即它是递归的最坏情况深度。例如,在 32 位平台上,递归的深度在最坏的情况下永远不会超过 32,假设qsort
.
换句话说,如果您特别关注堆栈使用情况,则无需担心,除非您正在处理一些奇怪的低质量实现。
归档时间: |
|
查看次数: |
6570 次 |
最近记录: |