ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173009.png) ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173453.png) ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173742.png) ![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20190622173824.png) 源码: ~~~ java public class Bubble { public static void main(String[] args) { int[] a = {5, 4, 2, 6, 8, 1, 9, 7, 3, 10, 0}; // bubble1(a); // bubble2(a); // bubble3(a); // bubble4(a); for (int i : a) { System.out.print(" " + i); } } /** * 最普通的冒泡排序,每次交换两个位置,最后一次只用换一个比较前两位 * * @param a */ private static void bubble1(int[] a) { if (null == a || a.length <= 1) return; int len = a.length; for (int i = 0; i < len; i++) { for (int j = 0; j < len - i - 1; j++) { if (a[j] < a[j + 1]) { a[j] = a[j] ^ a[j + 1]; a[j + 1] = a[j] ^ a[j + 1]; a[j] = a[j] ^ a[j + 1]; } } } } /** * 使用是否发生交换位置优化 * 设置一个标志,如果这一趟发生了交换,则为true, * 否则为false,如果有一趟没有发生交换,说明排序已经完成。 * * @param a */ private static void bubble2(int[] a) { if (null == a || a.length <= 1) return; int len = a.length;// 每次排序的边界值 boolean isSort = true;//是否发生交换,没交换排序完成 while (isSort) { isSort = false;//每次默认为不交换 for (int j = 0; j < len - 1; j++) { if (a[j] > a[j + 1]) { a[j] = a[j] ^ a[j + 1]; a[j + 1] = a[j] ^ a[j + 1]; a[j] = a[j] ^ a[j + 1]; isSort = true;//交换表明排序未完成 } } len--;//默认每次换一个值,总边界值减 1 } } /** * 根据边界值优化 * 找到一次循环的最后边界,然后记录下来,作为下次循环的终点 * * @param a */ private static void bubble3(int[] a) { if (null == a || a.length <= 1) return; int flag = a.length;//总长度,初始循环边界值,后面记录最后交换坐标 int len;// 每次循环的边界值 while (flag > 0) { len = flag;// 每次更新边界值 flag = 0;// 坐标重置,默认排序完成,如果未完成在下面更改 for (int j = 0; j < len - 1; j++) { if (a[j] > a[j + 1]) { a[j] = a[j] ^ a[j + 1]; a[j + 1] = a[j] ^ a[j + 1]; a[j] = a[j] ^ a[j + 1]; flag = j + 1; } } } } /** * 使用是否发生交换位置 & 记录边界位置 优化 * 即综合 bubble3 和 bubble4 * * @param a */ private static void bubble4(int[] a) { if (null == a || a.length <= 1) return; int len = a.length;// 外循环长度 int lastChange = 0;// 最后交换的点 int innerLen = len - 1;// 内循环的边界值 boolean isSorted;// 是否已经有序 for (int i = 0; i < len; i++) { isSorted = true;// 每次默认是有序的,内循环无值交换,即退出 for (int j = 0; j < innerLen; j++) { if (a[j] < a[j + 1]) { a[j] = a[j] ^ a[j + 1]; a[j + 1] = a[j] ^ a[j + 1]; a[j] = a[j] ^ a[j + 1]; lastChange = j + 1;// 记录最后移动位置 isSorted = false;// 当前循环发生交换,最起码本次为无序,继续循环看下次是否发生交换 } } innerLen = lastChange;// 更新内循环边界值 // 如果有序,也就是本次内循环没发生位置互换,直接退出循环,排序完成 if (isSorted) { break; } } } } ~~~