快速排序算法If/else逻辑问题:重复值丢失与性能疑问
关于快速排序的两个问题:重复值丢失与性能低下的原因
一、独立if写法导致重复值丢失的原因
你的初始代码里,两个独立的if只处理了小于pivot和大于pivot的元素:
if (array[i] < pivot) { less.push(array[i]); } if (array[i] > pivot) { greater.push(array[i]) }
当元素值等于pivot时,两个条件都不成立,这个元素既不会被加入less也不会进入greater,直接被丢弃。
比如测试数组[2, 1, 2],pivot是中间的1,最后一个2既不小于也不大于1,循环结束后这个元素就消失了,最终排序结果少了一个2。
改成if/else后,else会覆盖所有不小于pivot的情况(包含等于),等于pivot的元素会被加入greater数组,最终所有元素都能被保留到结果里。
二、该快排实现性能低下的原因
这个版本的快速排序比选择、冒泡还慢,核心问题出在两点:
- 非原地排序的额外开销:每次递归都要新建
less、greater两个数组,最后还要用展开运算符...合并数组,这些操作会产生大量内存复制,带来极高的时间损耗。而标准快速排序是原地排序,通过分区(partition)操作在原数组内交换元素,不需要额外创建数组,内存和时间效率远高于这种实现。 - 递归树不平衡导致时间复杂度退化:你选择数组中间元素作为pivot,但如果数组本身接近有序(比如升序/降序),这种选择和选首尾元素没有区别,会让递归树严重失衡,递归深度变成O(n),时间复杂度直接退化成O(n²)——和冒泡、选择排序处于同一量级。但因为你的实现多了数组复制的额外开销,实际运行速度反而更慢。
加continue解决不了问题,因为本质性能瓶颈不是循环判断次数,而是数组复制和递归结构的不平衡。
内容的提问来源于stack exchange,提问作者Alt
相关产品推荐
相关产品推荐

