數據結構之冒泡排序


排序思路:整個算法從最下面的元素開始,對相鄰的元素進行比較,經過交換使得較小的元素在較大的元素之上,經過對每個元素的兩兩比較,最后最小的元素被移到前面的位置。

算法實現:

public class BubbleSort {
    public static void bubbleSort(int arr[]){
        int temp;
        for(int i= 0; i < arr.length-1; i ++){//有N個元素只需比較N-1次
for(int j = arr.length-1; j > i; j --){//比較找到本真趟最小的元素 if(arr[j] < arr[j-1]){ temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } }
}
} public static void main(String[] args) { int array[] = {5,8,4,1,2,9}; System.out.println("排序之前:"); for(int element : array){ System.out.print(element + " "); } bubbleSort(array); System.out.println("\n排序之后:"); for(int element : array){ System.out.print(element + " "); } } }

算法改進:在某些情況下,可能在第i趟時元素就已經全部排好序了,此時我們就不必在再進行后面幾趟的比較了。

             如元素:1 2 3 4 9 8 7 6 5    從元素5開始第一趟比較開始,經過4趟的比較后元素由1 2 3 4 9 8 7 6 5  --->   1 2 3 4 5 6 7 8 9  這時由元素4開始進行第5趟比較

             在這趟比較結束后發現並沒有元素進行交換,說明后面的元素已經排好序了,無需再進行比較了。

算法實現:

public class BubbleSort {
//冒泡排序
//核心思想:比較兩個元素,如果前一個比后一個大則進行交換,經過對每個元素的比較,最后最大的元素被放在在最后位置
    public static void bubbleSort(int arr[]){
        int temp;
        for(int i= 0; i < arr.length-1; i ++){//有N個元素只需比較N-1次
            boolean flag = false;             //設置是否有元素交換的標志,false表示沒有,true表示有元素進行交換 for(int  j = arr.length-1; j > i; j --){
                if(arr[j] < arr[j-1]){
                    temp = arr[j]; 
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;  //元素移動了3次
                    flag = true;    //如果交換了則變為true                
                }    
                                          
            }
            if(!flag)//如:5 4 3 2 1 7 8 9
                break; //如果flag為false,則說說明這一趟沒有起先交換 ,已經排序好了,就不用再比較了
        }
    }
    public static void main(String[] args) {
        int array[] = {5,8,4,1,2,9};
        System.out.println("排序之前:");
        for(int element : array){
            System.out.print(element + " ");
        }
        
        bubbleSort(array);
        System.out.println("\n排序之后:");
        for(int element : array){
            System.out.print(element + " ");
        }
    }

}

算法分析:1.若初始數據序列是正序的,則進行一趟的比較后就完成了排序,此時比較的次數和移到次序均達到最小值:Cmin = n-1    Mmin = 0;

                 時間復雜度為O(n);(n為元素個數)

              2.若元素數據序列是反序,則需要進行n-1趟排序,每趟排序要進行n-i+1次比較(0≤i<n,i為趟數),且每趟比較都必須移動元素3次來交換元素位置。此時比較的次數和移動次數均達到最大值:Cmax = (n-1)+(n-2)+(n-3)+....+1 = n*(n-1)/2 = O(n2)     Mmax  = 3*[(n-1)+(n-2)+(n-3)+....+1] = 3*[n*(n-1)/2] = O(n2) ;

                 時間復雜度為O(n2) ;

              3.在冒泡排序中只使用了i,j,temp,flag這4個輔助變量,與問題規模n無關,所以空間復雜度為O(1)。

              4.當i > j且arr[i] = arr[j]時,兩者不進行交換,arr[i]和arr[j]的相對位置保持不變,所以冒泡排序是一種穩定的排序。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM