ZYa222999 2024-03-11 18:15 采纳率: 33.3%
浏览 4
已结题

java快速排序问题


package Sort;

public class QuickSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr1 = {6,3,7,9,5,1};
        Quick(arr1,0,arr1.length-1);
        for(int i = 0;i < arr1.length;i++) {
            System.out.print(arr1[i] + " ");
        }
    }
    public static void Quick(int[] arr,int left,int right) {
        if(left > right) {
            return;
        }
        int base = arr[left];
        int i = left;
        int j = right;
        while(i != j) {
            while(base < arr[j] && i < j) {
                j--;
            }
            while(base > arr[i] && i < j) {
                i++;
            }
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        arr[left] = arr[i];
        arr[i] = base;
        Quick(arr,left,i-1);
        Quick(arr,j+1,right);
    }
}

请问为什么输出结果不对呢?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-11 18:16
    关注

    引自免费微信小程序:皆我百晓生

    在你提供的Java快速排序代码中,问题出在while循环条件和交换元素的部分。以下是修正后的代码:

    package Sort;
    
    public class QuickSort {
    
        public static void main(String[] args) {
            int[] arr1 = {6, 3, 7, 9, 5, 1};
            Quick(arr1, 0, arr1.length - 1);
            for (int i = 0; i < arr1.length; i++) {
                System.out.print(arr1[i] + " ");
            }
        }
    
        public static void Quick(int[] arr, int left, int right) {
            if (left >= right) {
                return;
            }
            int base = arr[left];
            int i = left;
            int j = right;
    
            while (i < j) {
                // 找到右侧小于基准值的元素
                while (arr[j] > base && i < j) {
                    j--;
                }
                // 找到左侧大于基准值的元素
                while (arr[i] < base && i < j) {
                    i++;
                }
    
                // 当i < j时,交换这两个元素
                if (i < j) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
    
            // 将基准值放在正确的位置(即i位置)
            arr[left] = arr[i];
            arr[i] = base;
    
            // 对基准值左侧和右侧的子数组进行递归排序
            Quick(arr, left, i - 1);
            Quick(arr, i + 1, right);
        }
    }
    

    原代码存在的问题是,在while(i != j)循环中,当找到一个满足条件的元素后直接进行了交换,这可能会导致已经排好序的元素被错误地交换。修正后的代码确保了只有在i < j的情况下才进行交换,并且对左右指针分别判断基准值两边的元素,这样可以正确地实现快速排序算法。同时,将递归调用的边界条件修改为left >= right,避免在只有一个元素或没有元素时依然进行递归调用。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月29日
  • 创建了问题 3月11日

悬赏问题

  • ¥15 关于#自动化#的问题:如何通过电脑控制多相机同步拍照或摄影(相机或者摄影模组数量大于60),并将所有采集的照片或视频以一定编码规则存放至规定电脑文件夹内
  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)