更新时间:2022-01-11 来源:黑马程序员 浏览量:
(1)要求
能够用自己语言描述冒泡排序算法
能够手写冒泡排序代码
了解一些冒泡排序的优化手段
(2)算法描述
(3)算法实现
实现冒泡程序的代码如下:
public static void bubble(int[] a) { for (int j = 0; j < a.length - 1; j++) { // 一轮冒泡 boolean swapped = false; // 是否发生了交换 for (int i = 0; i < a.length - 1 - j; i++) { System.out.println("比较次数" + i); if (a[i] > a[i + 1]) { Utils.swap(a, i, i + 1); swapped = true; } } System.out.println("第" + j + "轮冒泡" + Arrays.toString(a)); if (!swapped) { break; } } }
优化点1:每经过一轮冒泡,内层循环就可以减少一次
优化点2:如果某一轮冒泡没有发生交换,则表示所有数据有序,可以结束外层循环
(4)进一步优化
public static void bubble_v2(int[] a) { int n = a.length - 1; while (true) { int last = 0; // 表示最后一次交换索引位置 for (int i = 0; i < n; i++) { System.out.println("比较次数" + i); if (a[i] > a[i + 1]) { Utils.swap(a, i, i + 1); last = i; } } n = last; System.out.println("第轮冒泡" + Arrays.toString(a)); if (n == 0) { break; } } }
每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可。