氣泡排序法

從陣列的第一個元素arr[0]開始,兩兩比較arr[0]與arr[0+1],如果前面的數大於後面的數(arr[i]>arr[i+1]),那麼交換兩個元素的位置,把大的數往後移動。這樣依次經過一輪比較以後,最大的數將會被交換到最後的位置arr[arr.length-1]。
接下來進行下一輪的比較,此輪比較的次數較上一輪少一次,因為上一輪中的最大值已經排到最後面。以此進行迴圈,直到排序結束。
氣泡排序法的最壞時間複雜度和平均時間複雜度都為O(n²),最壞需要比較的次數為n(n-1)/2。

圖解如下

陣列排序前 7 23 12 4 33 21 2 17 13 9
第一輪排序 7 12 4 23 21 2 17 13 9 33
第二輪排序 7 4 12 21 2 17 13 9 23
第三輪排序 4 7 12 2 17 13 9 21
第四輪排序 4 7 2 12 13 9 17
第五輪排序 4 2 7 12 9 13
第六輪排序 2 4 7 9 12
第七輪排序 2 4 7 9
第八輪排序 2 4 7
第九輪排序 2 4

程式碼實現(java)

public class BubbleSort {

    public static void main(String[] args){
        int arr[] = {6,10,5,2,3,7,9,1};
        bubblesort(arr);
        pt(arr);
    }

    public static void bubblesort(int arr[]){
        for(int i = 0 ; i < arr.length-1 ; i++){   //將第i+1個最大值放到陣列後面
            for(int j = 0 ; j < arr.length-i-1 ; j++){  //對相鄰元素進行比較、取逆。
                if(arr[j] > arr[j+1]){
                    swap(arr,j,j+1);
                }

            }
        }
    }

    //封裝交換位置方法。
    public static void swap(int arr[],int a , int b){

        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
    }

    public static void pt(int arr[]){
        for(int a:arr)
            System.out.print(a+" ");
        System.out.println();
    }

    //有的同學可能會用這個函式進行交換,這個函式在C++中是可用的,而在Java中是無效的。
    /*
     原因:
     java中基本資料型別為值傳遞(pass in value)
     swap_error中的引數a與b是形參,呼叫此方法的arr[j],arr[j+1]為實參
     呼叫此方法後,實參將值傳遞給形參a,b  由形參a,b再進行值的互換。
     由於是不是引用傳遞而是值傳遞,在呼叫此方法後,其arr[j],arr[j+1]實際並沒有發生變化。
     */
    public static void swap_error(int a , int b){
        int temp = a;
        a = b; 
        b = temp;
    }

}
//Think Big, Think Long