Java QuickSort算法实现结果异常,请求排查逻辑缺陷
快速排序代码错误排查与修复
嘿,我看到你的快速排序代码运行结果不对了,咱们来揪出问题根源并修复它~
核心错误分析
你的代码里最关键的问题出在pivot的使用逻辑上:
- 你在
QuickSort方法中计算的pivot是数组的索引位置(比如测试数组的中间索引是3),但在partition函数里,你直接用这个索引值(比如3)和数组元素做比较,而不是用该索引对应的数组元素值(比如1)!
这种逻辑错位会导致分区过程完全偏离预期,比如测试数组里第一个元素35和索引3比较,35 < 3显然不成立,left指针根本不会移动,后续的交换逻辑自然全乱了,最终出现排序不彻底的结果。
修复后的代码
我们只需要调整两处逻辑,就能让代码正常工作:
- 在递归的
QuickSort方法中,先获取pivot索引对应的元素值,再传入partition函数 - 修改
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
相关产品推荐
相关产品推荐

