排序算法(I)冒泡排序


     冒泡排序(Bubble Sort),它重復地走訪過要排序的元素,依次比較相鄰兩個元素,如果他們的順序錯誤就把他們調換過來,直到沒有元素再需要交換,

排序完成。這個算法的名字由來是因為越小(或越大)的元素會經由交換慢慢“浮”到數列的頂端   

      冒泡排序算法的運作如下:

  • 比較相鄰的元素,如果前一個比后一個大,就把它們兩個調換位置
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數
  • 針對所有的元素重復以上的步驟,除了最后一個
  • 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較

代碼實例  要排序的數組:int[] arr={25,18,21,9}; 

  • 排序前的數組為:25 18 21 9
  • 第1趟第1次排序后數組的順序:18 25 21 9
  • 第1趟第2次排序后數組的順序:18 21 25 9
  • 第1趟第3次排序后數組的順序:18 21 9 25
  • 第1趟排序后數組的順序:18 21 9 25
  • 第2趟第1次排序后數組的順序:18 21 9 25
  • 第2趟第2次排序后數組的順序:18 9 21 25
  • 第2趟排序后數組的順序:18 9 21 25
  • 第3趟第1次排序后數組的順序:9 18 21 25
  • 第3趟排序后數組的順序:9 18 21 25
  • 排序后的數組為:9 18 21 25

冒泡排序的優點:每進行一趟排序,就會少比較一次,因為每進行一趟排序都會找出一個較大值。如上例:第一趟比較之后,排在最后的一個數一定是最大的一個數,第二趟排序的時候,只需要比較除了最后一個數以外的其他的數,同樣也能找出一個最大的數排在參與第二趟比較的數后面,第三趟比較的時候,只需要比較除了最后兩個數以外的其他的數,以此類推……也就是說,沒進行一趟比較,每一趟少比較一次,一定程度上減少了算法的量。

用時間復雜度來說:

  1.如果我們的數據正序,只需要走一趟即可完成排序。所需的比較次數C和記錄移動次數M均達到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的時間復雜度為O(n)。

   2.如果很不幸我們的數據是反序的,則需要進行n-1趟排序。每趟排序要進行n-i次比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:

       

       冒泡排序的最壞時間復雜度為:O(n2) 。

綜上所述:冒泡排序總的平均時間復雜度為:O(n2) 

package com.yyx.sortingAlgorithm;
/**
 * 冒泡排序
 * yyx 2018年2月3日
 */
public class BubbleSort {
    public static void main(String[] args) {
        int temp;
        int[] arr={25,18,21,9}; 
        System.out.print("排序前的數組為:");
        for(int num:arr){
            System.out.print(num+" ");
        }
        for(int i=0;i<arr.length-1;i++){
            for(int j=0;j<arr.length-i-1;j++){
                if(arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
                System.out.println();
                System.out.print("第"+(i+1)+"趟第"+(j+1)+"次排序后數組的順序:");
                for(int num:arr){
                    System.out.print(num+" ");
                }
            }
            System.out.println();
            System.out.print("第"+(i+1)+"趟排序后數組的順序:");
            for(int num:arr){
                System.out.print(num+" ");
            }
            System.out.println();
        }
        System.out.println();
        System.out.print("排序后的數組為:");
        for(int num:arr){
            System.out.print(num+" ");
        }
    }
}

     優化

     對冒泡排序常見的改進方法是加入標志性變量exchange,用於標志某一趟排序過程中是否有數據交換。如果進行某一趟排序時並沒有進行數據交換,

則說明所有數據已經有序,可立即結束排序,避免不必要的比較過程

package com.yyx.sortingAlgorithm;

/**
 * 冒泡排序:它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
 *        走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成
 * yyx 2018年2月3日
 */
public class BubbleSort {
    public static void main(String[] args) {
        int temp;
        boolean bChange = false;
        int[] arr = { 25, 18, 21, 9 };
        //循環的趟數
        for (int i = 0; i < arr.length - 1; i++) {
            //每趟循環比較的次數
            for (int j = 0; j < arr.length - i - 1; j++) {
                // 比較相鄰的元素,如果前面的數大於后面的數,則交換
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    bChange = true;
                }
            }
            // bChange==false表示沒有交換
            if (bChange == false) {
                break;
            }
        }
        System.out.print("排序后的數組為:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

 


免責聲明!

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



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