概述
冒泡排序是一種簡單的排序算法。它重復地走訪要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的開始。
簡單點說,就是:
冒泡排序是將比較大的數字沉在數組的后面(可以理解為下面),較小的浮在前面(上面)。
直觀釋義圖:
步驟
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
針對所有的元素重復以上的步驟,除了最后一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
實例
原始數據:
3 5 2 6 2
第一輪
1
2
3
4
5
6
7
8
9
|
比較 3 和 5,5 大于 3 ,不需交換 3 5 2 6 2 繼續比較 5 和 2,5 大于 2,交換位置 3 2 5 6 2 繼續比較 5 和 6,6 大于 5,不需交換 3 2 5 6 2 繼續比較 6 和 2,6 大于 2,交換位置 3 2 5 2 6 6 下沉到最后,兩個2都分別向上(前)冒出。 |
第二輪
1
2
3
4
5
6
7
|
比較 3 和 2 , 3 大于 2 ,交換位置 2 3 5 2 6 比較 3 和 5 , 5 大于 3 ,不需交換 2 3 5 2 6 比較 5 和 2 , 5 大于 2 ,交換位置 2 3 2 5 6 不需比較 5 和 6 |
第三輪
1
2
3
4
5
|
比較 2 和 3 , 3 大于 2 ,不需交換 2 3 2 5 6 比較 3 和 2 , 3 大于 2 ,交換位置 2 2 3 5 6 不需比較了 |
第四輪
1
2
|
比較 2 和 2,不需交換 2 2 3 5 6 |
四輪結束
2 2 3 5 6
代碼實現(Java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package com.coder4j.main.arithmetic.sorting; public class Bubble { /** * 冒泡排序 * * @param array * @return */ public static int [] sort( int [] array) { int temp; // 第一層循環表明比較的輪數, 比如 length 個元素,比較輪數為 length-1 次(不需和自己比) for ( int i = 0 ; i < array.length - 1 ; i++) { System.out.println( "第" + (i + 1 ) + "輪開始" ); // 第二層循環,每相鄰的兩個比較一次,次數隨著輪數的增加不斷減少,每輪確定一個最大的,不需比較那個最大的 for ( int j = 0 ; j < array.length - 1 - i; j++) { if (array[j + 1 ] < array[j]) { temp = array[j]; array[j] = array[j + 1 ]; array[j + 1 ] = temp; } System.out.println( "第" + (i + 1 ) + "輪,第" + (j + 1 ) + "次比較:" ); for ( int k : array) { System.out.print(k + " " ); } System.out.println(); } System.out.println( "結果:" ); for ( int k : array) { System.out.print(k + " " ); } System.out.println(); } return array; } public static void main(String[] args) { int [] array = { 3 , 5 , 2 , 6 , 2 }; int [] sorted = sort(array); System.out.println( "最終結果" ); for ( int i : sorted) { System.out.print(i + " " ); } } } |
測試輸出結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
第1輪開始 第1輪,第1次比較: 3 5 2 6 2 第1輪,第2次比較: 3 2 5 6 2 第1輪,第3次比較: 3 2 5 6 2 第1輪,第4次比較: 3 2 5 2 6 結果: 3 2 5 2 6 第2輪開始 第2輪,第1次比較: 2 3 5 2 6 第2輪,第2次比較: 2 3 5 2 6 第2輪,第3次比較: 2 3 2 5 6 結果: 2 3 2 5 6 第3輪開始 第3輪,第1次比較: 2 3 2 5 6 第3輪,第2次比較: 2 2 3 5 6 結果: 2 2 3 5 6 第4輪開始 第4輪,第1次比較: 2 2 3 5 6 結果: 2 2 3 5 6 最終結果 2 2 3 5 6 |
經測試,與實例中結果一致。