1. 程式人生 > 實用技巧 >02_排序演算法之氣泡排序

02_排序演算法之氣泡排序

1.1 氣泡排序

1.1.1 演算法原理

  1. 比較相鄰的元素. 如果前一個元素比後一個元素大, 就交換這兩個元素的位置.
  2. 對每一對相鄰元素做同樣的工作, 從開始第一對元素到結尾的最後一對元素. 最終最後位置的元素就是最大值.

1.1.2 API設計

類名 Bubble
構造方法 Bubble(): 建立Bubble物件
成員方法 public static void sort(Comparable[] a); 對陣列內的元素進行排序
private static boolean greater(Comparable v, Comparable w);判斷大小
private static void exch(Comparable[] a, int i, int j) 交換陣列a中索引為i和j處的值

1.1.3 演算法實現

package a_sort.a_bubble;

/**
 * 本類為氣泡排序
 */
public class Bubble {
    /**
     * 對陣列a中的元素進行排序
     *
     * @param a 需要排序的陣列
     */
    public static void sort(Comparable[] a) {
        for (int i = a.length - 1; i > 0; i--) {
            for (int j = 0; j < i; j++) {
                //比較索引j和j+1處的值
                if(greater(a[j], a[j+1])){
                    exch(a, j, j+1);
                }
            }
        }
    }

    /**
     * 判斷元素v是否大於元素w
     *
     * @param v 元素v
     * @param w 元素w
     * @return v大於w則返回true, 否則為false
     */
    private static boolean greater(Comparable v, Comparable w) {
        return v.compareTo(w) > 0;
    }

    /**
     * 元素交換
     *
     * @param a 陣列
     * @param i 陣列中的元素索引
     * @param j 陣列中的元素索引
     */
    private static void exch(Comparable[] a, int i, int j) {
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
}

1.1.4 演算法測試

package a_sort.a_bubble;

import java.util.Arrays;

/**
 * 氣泡排序測試類
 */
public class BubbleTest {
    public static void main(String[] args) {
        Integer[] arr = {4, 5, 6, 3, 2, 1};
        Bubble.sort(arr);

        System.out.println(Arrays.toString(arr));
    }
}

1.1.5 氣泡排序時間複雜度分析

  1. 元素比較的次數為: (n-1) + (n-2) + ...+2 + 1 = n^2/2 - n/2
  2. 元素交換次數數為: (n-1) + (n-2) + ...+2 + 1 = n^2/2 - n/2
  3. 總執行次數為: n^2-n

根據大O推導法則, 氣泡排序時間複雜度為O(N^2), 複雜度比較高, 不適合大量資料排序.