算法思想:
核心:
拿着左邊的數字和右邊的數字比對,當左邊 > 右邊的時候,交換位置。
算法步驟:
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。
針對所有的元素重復以上的步驟,除了最后一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
代碼
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
if(arr[j] > arr[j + 1]){
// 交換位置。
// arr[j] 和 arr[j+1] 交換
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
比較次數:(n(n + 1)) / 2
過程
參與比較的數據:9 8 10 7 6 0 11
第1次循環:
8 9 10 7 6 0 11 (第1次比較:交換)
8 9 10 7 6 0 11 (第2次比較:不交換)
8 9 7 10 6 0 11 (第3次比較:交換)
8 9 7 6 10 0 11 (第4次比較:交換)
8 9 7 6 0 10 11 (第5次比較:交換)
8 9 7 6 0 10 11 (第6次比較:不交換)
最終冒出的最大數據在右邊:11
參與比較的數據:8 9 7 6 0 10
第2次循環:
8 9 7 6 0 10(第1次比較:不交換)
8 7 9 6 0 10(第2次比較:交換)
8 7 6 9 0 10(第3次比較:交換)
8 7 6 0 9 10(第4次比較:交換)
8 7 6 0 9 10(第5次比較:不交換)
參與比較的數據:8 7 6 0 9
第3次循環:
7 8 6 0 9(第1次比較:交換)
7 6 8 0 9(第2次比較:交換)
7 6 0 8 9(第3次比較:交換)
7 6 0 8 9(第4次比較:不交換)
參與比較的數據:7 6 0 8
第4次循環:
6 7 0 8(第1次比較:交換)
6 0 7 8(第2次比較:交換)
6 0 7 8(第3次比較:不交換)
參與比較的數據:6 0 7
第5次循環:
0 6 7(第1次比較:交換)
0 6 7(第2次比較:不交換)
參與比較的數據:0 6
第6次循環:
0 6 (第1次比較:不交換)
循環次數:n - 1
冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升性能來說並沒有什么太大作用。
代碼
for(int i = arr.length - 1; i > 0; i--){
int flag = 0;//將flag初始置為0
for(int j = 0; j < i; j++){
if(arr[j] > arr[j + 1]){
// 交換位置。
// arr[j] 和 arr[j+1] 交換
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
flag = 1;//發生交換將flag置為1
}
}
if(flag == 0) break;//flag為0表示本輪沒有元素發生交換,證明已經排好序了,直接跳出循環
}