前言
冒泡排序算法是由左向右,按順序對兩個數據比大小(如果是想數據由小到大排列),前一個比後一個大,那麼就交換一下位置。每循環一輪,都會將該輪循環所遇到的最大的數排到最後面。假設數組長度是length,那麼只要循環length - 1輪就可以把該數組按照由小到大排列好了。
冒泡排序過程
假設一個數組 int[ ] arr = new int[ ]{3,4,1,2,0};
第一輪遍歷:
①
交換前:
3 | 4 | 1 | 2 | 0 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於3 < 4所以位置不交換)
3 | 4 | 1 | 2 | 0 |
---|
②
交換前:
3 | 4 | 1 | 2 | 0 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於1 < 4所以位置交換)
3 | 1 | 4 | 2 | 0 |
---|
③
交換前:
3 | 1 | 4 | 2 | 0 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於2 < 4所以位置交換)
3 | 1 | 2 | 4 | 0 |
---|
④
交換前:
3 | 1 | 2 | 4 | 0 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於0 < 4所以位置交換)
3 | 1 | 2 | 0 | 4 |
---|
第一輪交換結束,該輪遇到的最大的數字4,已經排在最後面,並且4是此數組中最大的數,因爲該次遍歷完了所有數據
第二輪遍歷:
①
交換前:
3 | 1 | 2 | 0 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於1 < 3所以位置交換)
1 | 3 | 2 | 0 | 4 |
---|
②
交換前:
1 | 3 | 2 | 0 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於2 < 3所以位置交換)
1 | 2 | 3 | 0 | 4 |
---|
③
交換前:
1 | 2 | 3 | 0 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於0 < 3所以位置交換)
1 | 2 | 0 | 3 | 4 |
---|
由於4已經是最大的數字了,所以此處並不需要進行第4次交換。同時第二次遍歷數組會找出第二大的數,並將其排在了倒數第二的位置。
第三輪遍歷
①
交換前:
1 | 2 | 0 | 3 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於1 < 2所以位置不交換)
1 | 2 | 0 | 3 | 4 |
---|
②
交換前:
1 | 2 | 0 | 3 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於0 < 2所以位置交換)
1 | 0 | 2 | 3 | 4 |
---|
由於3是該輪第二大的數字,所以此處不需要進行第3輪交換,並且第三輪遍歷會找出該數組第三大的數,將其放在了倒三的位置。
第四輪遍歷
①
交換前:
1 | 0 | 2 | 3 | 4 |
---|---|---|---|---|
↑ | ↑ |
交換後:(由於0 < 1所以位置交換)
0 | 1 | 2 | 3 | 4 |
---|
由於2是該數組第三大的數字,所以此處不需要第2輪交換。至此,冒泡排序結束,最終數組已經排序完成,並且是由小到大排序。
規律總結
該數組的長度是 5
一共進行了4輪遍歷
第一輪遍歷:4次交換次數
第二輪遍歷:3次交換次數
第三輪遍歷:2次交換次數
第四輪遍歷:1次交換次數
排序結束。
該規律可以等價爲:
數組長度爲:length
①則需要進行:length - 1輪遍歷
換成for循環爲:(i = 0,1,2,…,length - 2),共循環length - 1次
for(int i = 0;i < length - 1;i++){
}
②第 i 輪遍歷所需的交換次數爲:length - 1 - i;(i 的初始值爲0)
換成for循環爲:(j = 0,1,2,…,length - 2 - i)
for(int j = 0;j < length - 1 - i;j++){
}
由於②的循環次數受①影響,所以②循環應該嵌套在①內,具體實現代碼如下:
示例代碼
public class BubbleSort {
public static void main(String[] args) {
int[] arr = new int[] {12,2,84,65,-51,57,85,11,54,-12};
int temp = 0;
for(int i = 0;i < arr.length - 1;i++) {//數組遍歷次數
for(int j = 0;j < arr.length - 1 - i;j++) {//第i次遍歷的交換次數
if(arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//將數組輸出
for(int i = 0;i < arr.length;i++) {
System.out.print(arr[i] + " ");
}
}
}