自行实现的快速排序partition函数仅过6/10用例,求逻辑问题排查
代码逻辑问题分析
你的partition实现存在多处错误,会在包含重复元素、pivot为重复值的测试用例下触发失败:
核心错误1:未隔离pivot元素
你在计算出pivot的正确位置newI并将pivot交换到该位置后,后续的双指针遍历交换逻辑没有将newI位置的pivot排除在交换范围外,导致pivot元素被交换到其他位置,最终你返回的newI位置存储的不再是pivot值,完全不符合partition函数返回pivot最终正确索引的要求。
失败测试用例示例
输入数组:[5,3,5,2,5],si=0,ei=4
- 初始pivot为
arr[0] = 5,统计小于5的元素共2个,newI=2 - 交换
arr[0]和arr[2],数组变为[5,3,5,2,5] - 双指针
i=0、j=4开始遍历:arr[i]=5不小于pivot、arr[j]=5不大于pivot,交换后数组不变,i变为1,j变为3arr[1]=3<5,i自增到2,arr[2]=5不小于pivot;arr[3]=2不大于pivot,交换arr[2]和arr[3],数组变为[5,3,2,5,5]i变为3,j变为2,循环结束
- 你返回
newI=2,但是arr[2]当前的值是2,不是pivot值5,逻辑完全错误。
核心错误2:等值元素处理逻辑缺失
你设置的左指针移动条件为arr[i] < pivot、右指针移动条件为arr[j] > pivot,所有等于pivot的元素都会被无差别交换,不仅会加速pivot位置的错乱,当数组中存在大量重复元素时,会直接导致分区结果不符合要求。
其他潜在问题
你贴出的自定义partition代码末尾缺少闭合的大括号,如果不是粘贴失误的话属于语法错误,也会引发运行异常。
修复建议
- 双指针交换阶段,跳过
newI位置的pivot元素,不要让其参与交换,保证最终newI位置始终是pivot值。 - 明确等值元素的分区规则:比如规定小于等于pivot的元素放左分区,大于pivot的放右分区,对应调整双指针的移动条件,避免等值元素无意义交换。
内容的提问来源于stack exchange,提问作者pifigi
相关产品推荐
相关产品推荐

