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

实现快速排序partition方法时do-while循环出现数组索引越界问题

问题根因
  • 边界判断缺失:两个do-while循环仅校验了元素与基准值的大小关系,未限制索引的合法范围。当待分区区间内所有元素都大于基准值时,j会持续自减到小于0,触发数组索引越界异常;同理若所有元素都小于基准值,i会自增到数组长度之外也会触发越界,你提到的j循环异常就是该原因导致。
  • 基准值交换逻辑错误:原代码中仅修改了存储基准值的局部变量,未将基准值真正交换到数组的对应位置,分区逻辑完全不生效。
  • 递归区间错误:左半部分递归区间包含了已经处于正确位置的基准值,会导致重复分区甚至死循环。
修复后的完整代码
public static void main(String[] args) {
    int tab[] = {-5, 12, 6, -2, 7, 9, 1};
    quickSort(tab, 0, tab.length-1);
    for (int x: tab){
        System.out.print(x+" ");
    }
}

public static int partition(int array[], int left, int right){
    int pivot = array[left];
    int i = left;
    int j = right;

    while (i < j) {
        // 增加i的边界判断,避免越界
        do {
            i++;
        } while (i < right && array[i] <= pivot);

        // 增加j的边界判断,避免越界
        do {
            j--;
        } while (j > left && array[j] > pivot);

        if (i < j) {
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }
    // 修正基准值交换逻辑,将基准值放到j的正确位置
    int temp = array[left];
    array[left] = array[j];
    array[j] = temp;

    return j;
}


public static void quickSort(int array[], int left, int right){
    if (left < right) {
        int pivot = partition(array, left, right);
        // 修正左递归区间,排除已排好的基准值
        quickSort(array, left, pivot - 1);
        quickSort(array, pivot + 1, right);
    }
}
验证结果

原测试数组排序后输出为:-5 -2 1 6 7 9 12,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:24:01