我正在阅读Sean Barrett的“ stb.h”库的源代码,并且对快速排序的实现有疑问。
因此,我对以下摘录感到特别困惑:
/* recurse on smaller side, iterate on larger */ \
if (j < (n-i)) { \
STB_(FUNCNAME,_quicksort)(p,j); \
p = p+i; \
n = n-i; \
} else { \
STB_(FUNCNAME,_quicksort)(p+i, n-i); \
n = j; \
}
我不明白为什么库选择在较小的一侧进行递归并在较大的一侧进行迭代;最后,难道它们都不都是从一开始就用更新的p和n执行函数吗?我的英语说得不太好,所以如果您需要进一步澄清,我很乐意提供。
答案 0 :(得分:1)
在较大的部分上进行迭代,仅对较小的部分使用递归,将已使用的堆栈空间减少为O(log(n)),否则最坏情况下的堆栈空间为O(n)。最坏的情况下时间复杂度保持在O(n ^ 2)。通过检查是否有过多的分区拆分,并在拆分过多时切换到堆排序(例如介绍排序),可以降低时间复杂度。