在学习快速排序的时候遇到了一些问题,代码正常运行但是排序结果并不正确
2条回答 默认 最新
- Kwan的解忧杂货铺@新空间代码工作室 2024-02-29 23:19关注
TsukiMikey 晚上好🌙🌙🌙
本答案参考通义千问问题分析: 你在学习快速排序的过程中遇到了排序结果不正确的问题。快速排序的代码中,关键部分在于
QuickSort
函数,尤其是分区过程和递归调用。根据提供的代码,看起来你在尝试对一个整数数组进行排序,但输出的排序结果并不是期望的[1, 2, 3, 4, 5, 6, 7, 9]。可能的问题点:
- 基准值选取错误:
QuickSort(arr, Left, right: i - 1)
和QuickSort(arr, left: i + 1, right)
的递归调用中,基准值base
的选取可能有问题。基准值应该是待排序区间内的元素,而不是固定不变。 - 分区过程错误:在
while
循环中,你可能没有正确地将大于或小于基准值的元素放置到正确的位置。 - 边界条件处理:递归终止条件可能是错误的,比如
i != j
,需要检查是否已经到达了数组的正确边界。
解决方案:
-
修复基准值选择:
- 在
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]; } }
- 在
-
更新递归边界:
- 递归终止条件应该调整为
i >= j
,表示已经没有更多的元素需要比较。
if (i >= j) { // 递归终止条件,这里不需要再调用QuickSort }
- 递归终止条件应该调整为
-
初始化基准值:
- 如果没有指定初始基准值,可以考虑使用第一个元素或最后一个元素。
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]。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 - 基准值选取错误:
悬赏问题
- ¥66 换电脑后应用程序报错
- ¥50 array数据同步问题
- ¥15 pic16F877a单片机的外部触发中断程序仿真失效
- ¥15 Matlab插值拟合差分微分规划图论
- ¥15 keil5 target not created
- ¥15 C/C++数据与算法请教
- ¥15 怎么找志同道合的伙伴
- ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
- ¥50 爬虫预算充足,跪巨佬
- ¥15 滑块验证码拖动问题悬赏