資料結構系列:圖文詳解氣泡排序 & 優化

Carson_Ho發表於2020-10-14

前言

本文主要講解排序演算法中最簡單的氣泡排序演算法,希望你們會喜歡。


目錄

示意圖


1. 簡介

屬於 內排序演算法中 的 交換排序類別


2. 演算法思想

  1. 自下而上對 相鄰的2個數依次 比較 & 調整
  2. 若 反序 則交換,直到 無反序的記錄 為止。

較大的數往下沉,較小的數類似氣泡一樣往上冒,故稱:氣泡排序


3. 演算法示意圖

整個過程就跟冒泡一樣,最小值一直往上“冒泡”,具體如下:

a. 2與6對比:因2<6,所以交換位置

示意圖

b. 2與4對比:因2<4,所以交換位置

示意圖

c. 2與7對比:因2<7,所以交換位置
示意圖

以此類推,最終將序列中最小值放到了首位(冒上來了)

示意圖


4. 演算法實現

4.1 具體程式碼

具體請看註釋

public class BubbleSort {

    /**
     * 基本的 氣泡排序
     */
    public static void bubbleSort(int[] srcArray) {
        int i,j; // 用於存放陣列下標
        int temp = 0; // 用於交換數值時臨時存放值

        for(i=0;i<srcArray.length-1;i++){
            // j 從後往前迴圈
            for(j=srcArray.length-2;j>=i;j--){
                // 若前者>後者,則交換位置
                if(srcArray[j]>srcArray[j+1]){
                    temp=srcArray[j];
                    srcArray[j]=srcArray[j+1];
                    srcArray[j+1]=temp;
                }
            }
        }

        // 輸出排序後的序列
        for(int a =0;a<srcArray.length;a++)
            System.out.println(srcArray[a]);
    }

    /**
     * 執行 氣泡排序
     */
    public static void main(String[] args) {

        // 定義待排序數列
        int[] src = new int[]{9, 1, 5, 8, 3, 7, 4, 2, 6};
        // 輸出結果
        bubbleSort(src);
    }
}

4.2 演算法示意圖

  1. 當 i =0時,演算法示意圖如下:

示意圖

  1. 當 i =1時,演算法示意圖如下:

示意圖

  1. i = 2、3、4依次類推…

4.3 最終測試結果

1
2
3
4
5
6
7
8
9

5. 演算法優化

  • 簡介

示意圖

  • 具體實現
public class BubbleSort {
    /**
     * 優化的 氣泡排序
     */
    public static void bubbleSortOpti(int[] srcArray) {

        int i,j; // 用於存放陣列下標
        int temp = 0; // 用於交換數值時臨時存放值

        // 標記位
        // flag = true:代表存在資料交換,即序列仍需排序,需繼續迴圈
        // flag = false:代表不存在資料交換,即序列不需排序,已經是有序序列了,可停止迴圈
        Boolean flag = true;
        // 若flag = false時退出迴圈
        for(i=0;i<srcArray.length-1 && flag;i++){

            flag = false; // 初始化為false

            // j 從後往前迴圈
            for(j=srcArray.length-2;j>=i;j--){
                // 若前者>後者,則交換位置
                if(srcArray[j]>srcArray[j+1]){
                    temp=srcArray[j];
                    srcArray[j]=srcArray[j+1];
                    srcArray[j+1]=temp;
                    flag = true; // 若有資料交換,則說明序列仍未無序
                }
            }
        }

        // 輸出排序後的序列
        for(int a =0;a<srcArray.length;a++)
            System.out.println(srcArray[a]);
    }

    /**
     * 執行 優化後的氣泡排序
     */
    public static void main(String[] args) {
        // 定義待排序數列
        int[] src = new int[]{2, 1, 3, 4, 5, 6, 7, 8, 9};
        // 輸出結果
        bubbleSortOpti(src);
    }
}

6. 效能分析

以下將分析演算法的效能:時間複雜度、空間複雜度、穩定性
示意圖


7. 總結

  • 本文主要講解了 排序演算法中 的氣泡排序
  • 下面我將繼續講解 資料結構,有興趣可以繼續關注Carson_Ho的安卓開發筆記

相關文章