一、什么是冒泡排序
1.1、文字描述
冒泡排序是一種簡單的排序算法。它重復地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,這也就說明排序已經完成。因為越大的元素會經由交換慢慢‘浮‘到數列的頂端,所以命名為冒泡算法排序。
1.2、程序描述
定義一個變量 i = 0,最大值為數列的長度 - 1 , i 與 i + 1 進行比較,如果 i > i + 1 則進行交換。隨著 i 的不斷增加,直到 i 達到數列長度 - 1。
附動態圖:
二、簡單的代碼展示
我們先進行最基礎的操作,再依次進行比對。
PS: 這樣會產生一些無效的操作,后面我們再進行優化...
public static void main(String[] args) {
int handleTimes = 0;
/* 定義一個簡單的亂序數組 */
int[] intArr = {2,4,1,5,6,3,7};
for (int i = 0;i < intArr.length; i++) {
/* 開啟雙重循環 */
for (int j = 0; j < intArr.length - i - 1; j++) {
/* 拿到當前操作的數據和下一個進行比較 */
if (intArr[j] > intArr[j + 1]) {
/* 我們按照從小到大排序,如果當前的大于下一個數據則兩個數據互換 */
int temp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = temp;
}
}
System.out.println("第" + handleTimes + "次排序" + CollectionUtils.arrayToList(intArr));
handleTimes++;
}
System.out.println(handleTimes);
System.out.println(CollectionUtils.arrayToList(intArr));
}
輸出如下:
三、代碼優化
通過上面的代碼我們可以看到一共進行了7次排序,但是從第四次開始已經是完成了的,后面的都是無效操作。所以我們對代碼進行了如下優化:
① 定義一個排序生效字段 isChanged,當排序進行時我們使其修改為true
② 每次大循環時我們都初始isChengerd為false,當每次大循環結束時,如果isChanged還是false,則進行已經沒有進行排序了
public static void main(String[] args) {
int handleTimes = 0;
boolean isChangerd = false;
/* 定義一個簡單的亂序數組 */
int[] intArr = {2,4,1,5,6,3,7};
for (int i = 0;i < intArr.length; i++) {
isChangerd = false;
/* 開啟雙重循環 */
for (int j = 0; j < intArr.length - i - 1; j++) {
/* 拿到當前操作的數據和下一個進行比較 */
if (intArr[j] > intArr[j + 1]) {
/* 我們按照從小到大排序,如果當前的大于下一個數據則兩個數據互換 */
int temp = intArr[j];
intArr[j] = intArr[j+1];
intArr[j+1] = temp;
/* 這里定義一個中間變量進行操作 */
isChangerd = true;
}
}
System.out.println("第" + handleTimes + "次排序" + CollectionUtils.arrayToList(intArr));
/* 如果這里如果上面的操作沒有交換則說明排序已經完成 */
if (!isChangerd) {
break;
}
handleTimes++;
}
System.out.println(CollectionUtils.arrayToList(intArr));
}
輸出如下: