You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自行实现的快速排序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

  1. 初始pivot为arr[0] = 5,统计小于5的元素共2个,newI=2
  2. 交换arr[0]和arr[2],数组变为[5,3,5,2,5]
  3. 双指针i=0、j=4开始遍历:
    • arr[i]=5不小于pivot、arr[j]=5不大于pivot,交换后数组不变,i变为1,j变为3
    • arr[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,循环结束
  4. 你返回newI=2,但是arr[2]当前的值是2,不是pivot值5,逻辑完全错误。

核心错误2:等值元素处理逻辑缺失

你设置的左指针移动条件为arr[i] < pivot、右指针移动条件为arr[j] > pivot,所有等于pivot的元素都会被无差别交换,不仅会加速pivot位置的错乱,当数组中存在大量重复元素时,会直接导致分区结果不符合要求。

其他潜在问题

你贴出的自定义partition代码末尾缺少闭合的大括号,如果不是粘贴失误的话属于语法错误,也会引发运行异常。

修复建议

  1. 双指针交换阶段,跳过newI位置的pivot元素,不要让其参与交换,保证最终newI位置始终是pivot值。
  2. 明确等值元素的分区规则:比如规定小于等于pivot的元素放左分区,大于pivot的放右分区,对应调整双指针的移动条件,避免等值元素无意义交换。

内容的提问来源于stack exchange,提问作者pifigi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:06:04