Java冒泡排序
冒泡排序(Bubble Sort)是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。
冒泡排序算法的運作如下:
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。
- 針對所有的元素重復以上的步驟,除了最后一個。
- 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
有一個數組 :
int array [] = {5,4,3,2,1};
現在要求從小到大進行排序,那么我們可以想象排序過后 應該是 {1,2,3,4,5}
那么 冒泡排序 的原理就是 :
每比較一輪,就把最大的放到最后面,這也是冒泡名稱的由來。
那么我們先做第一輪比較吧!
for (int i = 0; i < a.length - 1; i++){ if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序 int temp = a[ i + 1]; a[i + 1] = a[ i ]; a[ i ] = temp; } }
來細分一下 這個比較的過程 :
i = 0 ,a[0] 和 a[1]比較,完成后數組的順序應該是 :
4,5,3,2,1
i = 1 ,a[1] 和 a[2]比較,比較完以后,數組的順序應該是 :
4,3,5,2,1
i = 2, a[2] 和 a[3]比較,比較完以后,數組的順序應該是:
4,3,2,5,1
i = 3, a[3] 和 a[4]比較,比較完以后,數組的順序應該是:
4,3,2,1,5
當i=4的時候,由於要判斷 i<a.length - 1,不滿足,故退出比較。
所以第一輪比較完以后,數組的順序應該是 {4,3,2,1,5}.
此時對比結果,還需要比較,那么到底需要比較幾輪呢?幾輪呢?輪呢?呢~~~~??
如果 “每次把最大的數字冒到最后去” 算一輪的話,那么在最極端情況下[比如本例],那么應該是n-1輪,那么又有同學問了,為什么是n-1輪呢?
那再舉個例子,2個數字 {2,1}比較的話,把大的放后面去要幾輪呢?1輪,也就是 2 - 1 輪,呵呵,推廣一下就是 n - 1輪了。
所以 冒泡的代碼應該是這個樣子的 :
1 for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 標示 n - 1輪 2 for (int i = 0; i < a.length - 1; i++){ 3 if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序 4 int temp = a[ i + 1]; 5 a[i + 1] = a[ i ]; 6 a[ i ] = temp; 7 } 8 } 9 }
到這里冒泡其實已經結束了。
但是其實還有一個優化空間。。。
我們前面已經發現,
經過第一輪排序,最大的一個已經到最后一個位置了。。
經過第二輪排序,次大的一個已經到倒數第二個位置了。。
以此類推,所以每經過一輪排序,那么“對應的倒數位置”的數字其實已經不用對比了。。。
比如 經過第一輪排序,那么在進行第二輪排序的時候,倒數第一個其實已經不用對比了,因為再第一輪排序的時候,已經非常明確,最后一個就是最大的了。。
所以這里就有一個優化的地方 :
for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 標示 n - 1輪 for (int i = 0; i < a.length - 1 - j; i++){//這里減去一個 " j" ,那么每次比較 “對應的倒數位置”的數字就不會對比了 if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的話,二者就交換順序 int temp = a[ i + 1]; a[i + 1] = a[ i ]; a[ i ] = temp; } } }