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

Java快速排序(Quicksort)实现未返回预期结果求助

快速排序代码问题修复

你的代码存在两个关键问题导致无法正常运行:

1. 交换方法传参错误

在partition方法的最后一行,你错误地将元素值传递给了swap方法,但swap方法需要的是数组的索引值:

// 错误写法:把list[i+1](元素值)当成索引传入
swap(list, list[i + 1], list[hi]);
// 正确写法:传入索引i+1和hi
swap(list, i + 1, hi);

这个错误会导致swap方法触发索引越界判断直接返回(比如元素值大于数组长度时),或是交换了错误的位置,彻底打乱排序逻辑。

2. 循环范围冗余(非致命但可优化)

partition里的for循环不需要遍历到hi(因为pivot本身就是list[hi],无需和自身比较),可以把循环条件改为j < hi,避免无效判断:

// 原写法
for (int j = li; j <= hi; j++){
// 优化后
for (int j = li; j < hi; j++){
}

修复后的完整代码

public class Quicksort {
    public void sort(int[] list){
        sort(list, 0, list.length - 1);
    }

    private void sort(int[] list, int li, int hi){
        if (li < hi){
            int pi = partition(list, li, hi);
            sort(list, li, pi - 1);
            sort(list, pi + 1, hi);
        }
    }

    private int partition(int[] list, int li, int hi){
        int pivot = list[hi];
        int i = (li - 1);
        
        // 优化循环范围到j < hi
        for (int j = li; j < hi; j++){
            if (list[j] < pivot){
                i++;
                swap(list, i, j);
            }
        }

        // 修复swap的参数为索引
        swap(list, i + 1, hi);
        return (i + 1);
    }

    private void swap(int[] list, int a, int b){
        if (a >= list.length || b >= list.length || a < 0 || b < 0){
            return;
        }

        int temp = list[a];
        list[a] = list[b];
        list[b] = temp;
    }

    // 补充:原getPivot方法的中间索引计算错误,正确应为(li+hi)/2,该方法目前未被调用
    private int getPivot(int[] list, int li, int hi){
        int mi = (li + hi) / 2;
        int chosen = Math.max(Math.max(list[hi], list[li]), list[mi]);
        System.out.println(chosen);
        return chosen;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:55:24