数组长度为7时Bubble Sort算法的异常问题排查
你的冒泡排序实现存在两个核心问题
1. 内层循环未排除已排序的末尾元素
冒泡排序的核心逻辑是每一轮外层循环都会把当前未排序部分的最大元素“冒泡”到数组末尾,因此后续的内层循环完全不需要再比较这些已经排好序的元素。你的代码里内层循环条件写的是j < arr.length - 1,每一轮都会遍历整个数组,这不仅白白浪费性能,还会做很多无意义的重复比较。
正确的内层循环条件应该改成:
for (int j = 0; j < arr.length - 1 - i; j++)
这里的-i就是用来跳过已经排好序的最后i个元素。
2. 输出位置错误导致结果展示异常
你在每轮外层循环结束后打印arr[i],但实际上每轮排序完成后,当前最大的元素会被放到数组的arr.length - 1 - i位置,而不是arr[i]。比如第一轮排序后,最大元素在数组最后一位,第二轮在倒数第二位,以此类推。你打印arr[i]的操作,输出的是数组前半部分的元素,这和你预期的每轮排序结果完全不符,这也是你看到异常输出的直接原因。
如果要正确展示每轮排序后的状态,应该打印整个数组,或者打印当前归位的元素:
// 打印整个数组的示例代码 System.out.print("This is Arr " + id + ": "); for (int num : arr) { System.out.print(num + " "); } System.out.println();
修正后的完整代码
public class BubbleSort { public static void main(String[] args) { int[] arr1 = {2, 34, 65, 65, 10, 32, 45}; int[] arr2 = {2, 65, 65, 10, 32, 45}; int[] arr3 = {2, 34, 65, 65, 32, 45}; int[] arr4 = {2, 12, 15, 34, 65, 65, 32, 45}; int[] arr5 = {2, 34, 65, 65, 20, 32, 45}; bubbleSort(arr1, 1); bubbleSort(arr2, 2); bubbleSort(arr3, 3); bubbleSort(arr4, 4); bubbleSort(arr5, 5); } public static void bubbleSort(int[] arr, int id) { for (int i = 0; i < arr.length; i++) { boolean swapped = false; // 新增标记:判断本轮是否有交换,提前终止排序 for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = tmp; swapped = true; } } // 打印每轮排序后的完整数组 System.out.print("This is Arr " + id + ": "); for (int num : arr) { System.out.print(num + " "); } System.out.println(); if (!swapped) { break; // 本轮无交换,说明数组已完全有序,直接退出循环 } } } }
内容的提问来源于stack exchange,提问作者henson
相关产品推荐
相关产品推荐

