對於一個無序列,咱們想要將它轉換成有序列,所謂的有序列爲升序(由小到大)或者降序(由大到小),要完成這樣的排序,有不少種排序算法,下面介紹其中一種:冒泡排序。算法
冒泡排序的原理爲:以升序爲例,將相鄰的兩個元素進行比較,若是前面一個元素比後面一個元素大,則二者進行進行交換。後面的以此類推,下面進行圖解。數組
好比如今有一個數組爲:int[] num = {6,5,9,1,2,4};如今要將這個數組中的元素排列爲升序排列:1,2,4,5,6,9spa
根據冒泡排序的原理:數組中的元素用相鄰(下標相鄰)的兩個元素進行比較,若是前面比後面的值大,則交換:code
第一趟排序:6,5,9,1,2,4blog
第一次比較:6和5比較,前面6比後面5大,則二者交換,交換後結果爲:5,6,9,1,2,4 (每次獲得的結果用於下一次比較)排序
第二次比較:6和9比較,前面6比後面9小,則二者不交換,結果爲:5,6,9,1,2,4for循環
第三次比較:9和1比較,前面9比後面1大,則二者交換,交換後結果爲:5,6,1,9,2,4class
第四次比較:9和2比較,前面9比後面2大,則二者交換,交換後結果爲:5,6,1,2,9,4原理
第五次比較:9和4比較,前面9比後面4大,則二者交換,交換後結果爲:5,6,1,2,4,9循環
以上是第一趟排序,數組一共有6個元素,相鄰的兩個比較,一共比較了5次,當一趟排序完成以後,最大值9已經在最後面了,那麼下次比較將不用再作比較了。
第二趟排序:5,6,1,2,4,9
第一次比較:5和6比較,前面5比後面6小,則二者不交換,結果爲:5,6,1,2,4,9
第二次比較:6和1比較,前面6比後面1大,則二者交換,結果爲:5,1,6,2,4,9
第三次比較:6和2比較,前面6比後面2大,則二者交換,結果爲:5,1,2,6,4,9
第四次比較:6和4比較,前面6比後面4大,則二者交換,結果爲5,1,2,4,6,9
第三趟排序:5,1,2,4,6,9
第一次比較:5和1比較,前面5比後面1大,則二者交換,交換後結果爲:1,5,2,4,6,9
第二次比較:5和2比較,前面5比後面2大,則二者交換,交換後結果爲:1,2,5,4,6,9
第三次比較:5和4比較,前面5比後面4大,則二者交換,交換後結果爲:1,2,4,5,6,9
第四趟排序:1,2,4,5,6,9 (可能有人會認爲,這裏已經獲得正確的排序了,後面就不須要再排序了,不能這麼理解,由於咱們數組的值不必定每次都是這幾個數字,所以仍是須要繼續比較完)
第一次比較:1和2比較,前面1比後面2小,則二者不交換,結果爲:1,2,4,5,6,9
第二次比較:2和4比較,前面2比後面4小,則二者不交換,結果爲:1,2,4,5,6,9
第五趟排序:1,2,4,5,6,9
第一次比較:1和2比較,前面1比後面2小,則二者比較換,結果爲:1,2,4,5,6,9
以上就是對數組中的元素進行比較分析,下面是圖示:
經過文字說明和圖示說明,咱們能夠很輕鬆的寫出每一趟相鄰兩個數比較的代碼:
1 for(int i =0;i < num.length-1;i++){ 2 //實現相鄰的兩個數進行比較 3 if(num[i] > num[i+1]){ 4 //前面比後面的數大,則二者進行交換 5 int temp = num[i]; 6 num[i] = num[i+1]; 7 num[i+1] = num[i]; 8 } 9 }
執行完上面的代碼後,表明的是一趟排序,能夠完成一趟之內,相鄰的兩個數進行比較,也就是說要完成冒泡排序,只要將上面的代碼執行5次就能夠了,
可是仍是有問題,單從代碼上面閱讀來看,循環完以上代碼,必定會比較5次,可是實際上,根據圖示能夠很清楚的看出來,每多一趟排序,則少比較一次。
那麼一下才是完整的冒泡排序:
1 public void bubble(){ 2 //定義一個數組: 3 int[] num = {6,5,9,1,2,4}; 4 //使用循環:外層循環表示須要排序多少趟,num.length-1=5,保證進行5次排序 5 for(int i = 0;i < num.length-1;i++){ 6 //使用循環,完成每一趟排序中的全部比較,注意:每多比較一趟,則少比較一次 7 for(int j = 0;j < num.length-1-i;j++){ 8 //兩個相鄰的兩個數進行比較: 9 if(num[j] > num[j+1]){ 10 //前面的數比後面的數大,則交換 11 int temp = num[j]; 12 num[j] = num[j+1]; 13 num[j+1] = temp; 14 } 15 } 16 } 17 }
注意:閱讀如下上面的代碼
第一個for循環:i < num.length-1;目的是爲了讓實現排序的趟數比數組長度少1,好比上面6個元素的數組,只須要排序5次
第二個for循環:表示每一趟排序中,相鄰兩個數的比較,j < num.length-1-i;這個減小i是什麼意思呢減i是爲了實現,每多一趟排序,則相鄰的兩個數比較次數減小一次,而i又是從0開始的。
若是還不明白,閱讀如下代碼流程:
第一趟排序:
當i = 0 則num.length-1-i = 5 很容易得出第二個循環會循環5次,也就是說會有5組相鄰的兩個數進行比較
當i = 1,則num.length-1-i = 4 則第二個for循環會循環4次,也就是說會有4組相鄰的兩個數進行比較
當i = 2 則num.length-1-i = 3 則第二個for循環會循環3次,也就是說會有3組相鄰的兩個數進行比較
當i = 3 則num.length-1-i = 2 則第二個for循環會循環2次,也就是說會有3組相鄰的兩個數進行比較
當i = 4 則num.length-1-i = 1 則第二個for循環會循環1尺,也就是說會有3組相鄰的兩個數進行比較
因此:第一個for循環是控制咱們須要排序多少趟,而第二個for循環是控制咱們在每一趟中須要多少次相鄰兩個數進行比較。
以上爲冒泡排序。加油!