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

Java QuickSort算法实现结果异常,请求排查逻辑缺陷

快速排序代码错误排查与修复

嘿,我看到你的快速排序代码运行结果不对了,咱们来揪出问题根源并修复它~

核心错误分析

你的代码里最关键的问题出在pivot的使用逻辑上:

  • 你在QuickSort方法中计算的pivot是数组的索引位置(比如测试数组的中间索引是3),但在partition函数里,你直接用这个索引值(比如3)和数组元素做比较,而不是用该索引对应的数组元素值(比如1)!

这种逻辑错位会导致分区过程完全偏离预期,比如测试数组里第一个元素35和索引3比较,35 < 3显然不成立,left指针根本不会移动,后续的交换逻辑自然全乱了,最终出现排序不彻底的结果。

修复后的代码

我们只需要调整两处逻辑,就能让代码正常工作:

  1. 在递归的QuickSort方法中,先获取pivot索引对应的元素值,再传入partition函数
  2. 修改partition函数的参数和内部比较逻辑,使用pivot元素值而非索引进行比较

以下是完整的修正代码:

import java.util.Arrays;
public class JavaFiddle {
    static int[] myArray = new int[]{35, 12, 25, 1, 5, 33, 56};
    
    public static void QuickSort(int[] array) {
        QuickSort(array, 0, array.length - 1);
    }
    
    public static void QuickSort(int[] array, int left, int right) {
        if (left < right) {
            // 先计算pivot的索引,再获取对应的值
            int pivotIndex = left + ((right - left) / 2);
            int pivotValue = array[pivotIndex];
            int index = partition(array, left, right, pivotValue);
            QuickSort(array, left, index - 1);
            QuickSort(array, index + 1, right);
        }
    }
    
    // 参数改为接收pivot的值而非索引
    public static int partition(int[] array, int left, int right, int pivotValue) {
        while (left < right) {
            // 用pivot的值和元素比较
            while (array[left] < pivotValue) {
                left++;
            }
            while (array[right] > pivotValue) {
                right--;
            }
            if (left < right) {
                swap(array, left, right);
                left++;
                right--;
            }
        }
        return left;
    }
    
    public static void swap(int[] array, int left, int right) {
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }
    
    public static void main(String[] args) {
        System.out.println(Arrays.toString(myArray));
        QuickSort(myArray);
        System.out.println(Arrays.toString(myArray));
    }
}

运行结果验证

修复后运行代码,输出会是:

[35, 12, 25, 1, 5, 33, 56]
[1, 5, 12, 25, 33, 35, 56]

完全符合预期的排序结果~

可选优化(非必须)

如果想让快速排序的分区逻辑更规范,还可以在调用partition前,把pivot元素和右边界元素交换,避免分区过程中pivot的位置被改动,不过这不是你当前问题的核心,只是一个小优化点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:27:46