分析:
- 依次比較兩個相鄰的元素,將值大的元素交換到右邊
- N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數爲(N-i)次,所以可以用雙重循環語句,外層控制循環多少趟,內層控制每一趟的循環次數
冒泡排序的優點:
- 每進行一趟排序,就會少比較一次,因爲每進行一趟排序都會找出一個較大值。如上例:第一趟比較之後,排在最後的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最後一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數後面,第三趟比較的時候,只需要比較除了最後兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了算法的量。
代碼實現
public class Test {
public static void main(String[] args) {
int[] arrs = {11, 15, 12, 10, 8, 5, 4, 15};
bubbleSort (arrs);
System.out.println (Arrays.toString (arrs));
}
/**
* 冒泡排序
*
* @param arrs
* @return
*/
public static void bubbleSort(int[] arrs) {
// 獲取數組的長度
int len = arrs.length;
// 判斷邊界,爲null或只存在一個數字直接返回
if (arrs == null || len < 2) return;
/**
* 思想:兩兩比較,較大的數排右邊,一輪下來可以確定數組的最後一位爲最大數值
* len - i - 1 表示每輪循環不比較已確定的數值
*/
for (int i = 0; i < len - 1; i++) {
for (int j = 0; j < len - i - 1; j++) {
// 相鄰兩數比較,大的數組替換位置
if (arrs[j] >= arrs[j + 1]) {
arrs[j] = arrs[j + 1] + arrs[j] - (arrs[j + 1] = arrs[j]);
}
}
}
}
}