基礎演算法筆記-氣泡排序
氣泡排序(Bubble Sort)
之前大一的時候學的第一個排序就是氣泡排序,那時候用的是C語言,現在用java語言複習一下做個筆記,歡迎批評指點錯誤。
作用:
排序,就是將幾個數從小到大或者從大到小的順序排列。就像小學生排隊回家一樣(ps:小學生除了會排位,還是會排隊的),他們可以從高的到矮的排隊,也可以從矮到高的排隊。氣泡排序演算法就是把混亂的隊排整齊的。
思路:
1、依次對相鄰的兩個數字對比,如果第一個前面的數字比後面的數字大,那麼兩個數字就交換,也就是將大的數字放在後面(這裡拿從小到大的順序排序)。比如:首先比較第1個數和第2個數,將這兩個數中較大的放在第2個,較小的放在第1個;然後比較第2個和第2個數,將這兩個數中較大的放在第3個,較小的放在第2個。
2、這樣一趟下來,要排序的數中最大的數就被放到了最後一個。
3、第二趟還重複1中的步驟,但是不要比較最後一個(因為最後一個已經是最大的了,但是每次都比較所有的數也是可以的,但是效率就不高了,所以這樣沒必要,,,真的沒必要。(!!-_-))。
4、第三趟也是重複1中的步驟,但是不要比較最後兩個了。。
5、以此類推。
舉例:
1、假設有6個小朋友他們的身高分別為{6,3,2,1,5,4},我們用氣泡排序的方法對他們進行從矮到高的排隊(下圖每個方塊代表一個小朋友,裡面的數字代表他們的身高)。
//用java程式表示就是一個數組int[] student= {6,3,2,1,5,4};
2、第一輪排序:
第一次:我們首先對第1個和第2個小朋友身高進行比較,我們發現第1個小朋友比第2個小朋友高,所有就將第1個小朋友放到第2位去。
//用java表示就是一個for語句,其中用i=0的時候是第一輪排序,i=1時候是第二輪排序;而比較就是一個if的條件語句 for(int i=0;i<6;i++){ }
第二次:然後我們對上面排好的小朋友再比較,這次我們將第2個小朋友跟第3個小朋友比較,我們發現:第2個小朋友,明顯比第3個小朋友高,所有我們又把他往後排(用程式碼表示就是一個if語句加上一個交換變數值的式子
//用j表示每次迴圈中的對比次數,對此次數每輪都減少i個,因為每輪結束後當前最高的小朋友就被排到最後了,就不用管他了(規律是:第1輪減少0個,第二輪減少1個) for(int i=0;i<6;i++){ for(int j=1;j<6-i-1;j++) { } }
然後是第三次比較,第四次比較等等都是相同的。。。。。。。。。(整理一下第一輪的排序如下圖)
由圖可知,我們第一輪就將長的最高的那位小朋友排到了最後。然後就不用管他了,因為他已經呆在了正確的位置了,接下來他只要看著前面五個小朋友被拉過來拉過去的排隊就行了。
圖中的那個最高的小朋友是不是像水泡一樣,從鍋底,一步步的冒到了最上面(把第一位置想想成鍋底,最後一個位置想想程最上面)
接下來只要再進行4輪同樣的對比和交換就可以將剩下的小朋友排好了
程式碼實現:
public static void main(String[] args) { //用程式表示就是一個數組 int[] student= {6,3,2,1,5,4}; //用java表示就是一個for語句,其中用i=0的時候是第一輪排序,i=1時候是第二輪排序 for(int i=0;i<6;i++) { //用j表示每次迴圈中的對比次數,對此次數每輪都減少i個,因為每輪結束後當前最高的小朋友就被排到最後了,就不用管他了(規律是:第1輪減少0個,第二輪減少1個) for(int j=0;j<6-i-1;j++) { //用下面的if語句進行對比,並進行交換 int middle=0; if(student[j]>student[j+1]) { //位置交換程式碼 middle=student[j]; student[j]=student[j+1]; student[j+1]=middle; } } } }
程式碼優化一下:
public class BubbleSort { public static void main(String[] args) { int[] student= {6,3,2,1,5,4,213,124,2}; for(int i=1;i<6;i++) { for(int j=0;j<student.length-i;j++) { if(student[j]>student[j+1]) { student[j]=student[j]+student[j+1]; student[j+1]=student[j]-student[j+1]; student[j]=student[j]-student[j+1]; } } } for(int i=0;i<student.length;i++) { System.out.print(student[i]+" "); } } }
歡迎大佬給出建議。。。。