1. 程式人生 > >基礎演算法筆記-氣泡排序

基礎演算法筆記-氣泡排序

氣泡排序(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]+"   ");
        }
    }
}

 

 


歡迎大佬給出建議。。。。