快速排序法:空间复杂度O(1),原地和栈使用空间的定义是否有矛盾?

来源:3-1 基于比较排序算法大总结

慕田峪2135618

2024-03-20 16:57:15

老师,今天回过头来看排序算法,快速排序的实现无法绕过栈的使用(即使不使用递归而是显式维护一个栈模拟递归过程),栈使用的空间复杂度与深度相关,平均情况O(logn),最坏情况O(logn)。递归/显式栈的空间使用应该是算法空间开销的一部分。那么,快速排序“空间复杂度O(1)”,“是一个原地排序算法”的提法,是不是存在矛盾?讨论时是否不应该忽略栈的空间开销?

写回答

1回答

liuyubobobo

2024-03-28

你的理解是非常正确的。快排的空间度应该是  O(logn),logn 是递归调用栈的深度。


这和“原地排序”不冲突。实际上原地排序并不是一个被非常严谨定义地概念。原地排序就是指,我们不需要开辟一个完整的 O(n) 的空间,把原来的数组中的元素复制一遍,才能排好序。只利用最初给定的数组,就能完成这个排序。从这个意义上,快排是原地排序。


值得一提的是,如果快排不需要“原地排序”这个限制的话,将非常容易完成。对于每次 partition 的过程,都开一个一样大小的辅助空间 temp。小于 Pivot 的元素从前往后放进 temp,大于 pivot 的元素从后往前放进 temp,别忘了最后放 temp,然后把 temp 再拷贝回原始数组 num 中相应位置就好了。


继续加油!:)

0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2603 学习 · 1086 问题

查看课程