遥不可及的AK 2024-02-29 23:18 采纳率: 90%
浏览 3
已结题

快速排序学习时遇到的问题

在学习快速排序的时候遇到了一些问题,代码正常运行但是排序结果并不正确

img

img

  • 写回答

2条回答 默认 最新

  • 关注

    TsukiMikey 晚上好🌙🌙🌙
    本答案参考通义千问

    问题分析: 你在学习快速排序的过程中遇到了排序结果不正确的问题。快速排序的代码中,关键部分在于QuickSort函数,尤其是分区过程和递归调用。根据提供的代码,看起来你在尝试对一个整数数组进行排序,但输出的排序结果并不是期望的[1, 2, 3, 4, 5, 6, 7, 9]。

    可能的问题点:

    1. 基准值选取错误QuickSort(arr, Left, right: i - 1)QuickSort(arr, left: i + 1, right) 的递归调用中,基准值base的选取可能有问题。基准值应该是待排序区间内的元素,而不是固定不变。
    2. 分区过程错误:在while循环中,你可能没有正确地将大于或小于基准值的元素放置到正确的位置。
    3. 边界条件处理:递归终止条件可能是错误的,比如i != j,需要检查是否已经到达了数组的正确边界。

    解决方案:

    1. 修复基准值选择

      • while循环内,每次迭代时,根据当前arr[j]base的关系,将arr[j]arr[i]交换位置。如果arr[j]大于base,将其与arr[i]交换,并让i++;如果arr[j]小于base,让j--
      while (i < j) {
          while (arr[j] > base) {
              j--;
          }
          if (i < j) {
              arr[i++] = arr[j];
          }
          while (arr[i] < base) {
              i++;
          }
          if (i < j) {
              arr[j--] = arr[i];
          }
      }
      
    2. 更新递归边界

      • 递归终止条件应该调整为i >= j,表示已经没有更多的元素需要比较。
      if (i >= j) {
          // 递归终止条件,这里不需要再调用QuickSort
      }
      
    3. 初始化基准值

      • 如果没有指定初始基准值,可以考虑使用第一个元素或最后一个元素。
      if (left == right) {
          // 处理数组只有一个元素的情况
      } else {
          int pivotIndex = partition(arr, left, right);
          // 调用递归
          QuickSort(arr, left, pivotIndex - 1);
          QuickSort(arr, pivotIndex + 1, right);
      }
      

    完整修正后的代码:

    public class QuickSort {
        public static void quickSort(int[] arr, int left, int right) {
            if (left < right) {
                int pivotIndex = partition(arr, left, right);
                QuickSort(arr, left, pivotIndex - 1);
                QuickSort(arr, pivotIndex + 1, right);
            }
        }
    
        private static int partition(int[] arr, int left, int right) {
            int pivot = arr[right];
            int i = left - 1;
            
            for (int j = left; j < right; j++) {
                if (arr[j] <= pivot) {
                    i++;
                    swap(arr, i, j);
                }
            }
            swap(arr, i + 1, right); // 将基准值放到正确的位置
            return i + 1;
        }
    
        private static void swap(int[] arr, int i, int j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    
        public static void main(String[] args) {
            int[] arr = {1, 3, 6, 9, 7, 4, 2, 5};
            quickSort(arr, 0, arr.length - 1);
            for (int num : arr) {
                System.out.print(num + " ");
            }
        }
    }
    

    运行这段代码后,你应该会得到期望的排序结果[1, 2, 3, 4, 5, 6, 7, 9]。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月29日
  • 创建了问题 2月29日

悬赏问题

  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏