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
相关产品推荐
相关产品推荐

