天天看點

冒泡排序和基數排序

一,冒泡排序

算法思路

冒泡排序的原理可以顧名思義:把每個資料看成一個氣泡,按初始順序自底向上依次對兩兩氣泡進行比較,對上重下輕的氣泡交換順序(這裡用氣泡輕、重表示資料大、小),保證輕的氣泡總能浮在重的氣泡上面,直到最輕的氣泡浮到最上面;保持最後浮出的氣泡不變,對餘下氣泡循環上述步驟,直到所有氣泡從輕到重排列完畢。

冒泡排序和基數排序

算法分析

  1. 穩定排序
  2. 時間複雜度;亂序:O(N^2),有序:O(N)
  3. 空間複雜度:O(1)

算法實作

public class BubbleSort {

    /**
     * 冒泡排序 --- O(N^2)
     * 有序數組 --- O(N)
     * @param a
     */
    public static void bubleSort(int[] a){
        int tmp;
        //第一層循環是比較的輪數
        for(int i = 0;i<a.length-1;i++){
            //第二層循環是每一輪比較的次數
            for(int j = 0;j<a.length-i-1;j++){
                //交換
                if(a[j] > a[j+1]){
                    tmp = a[j];
                    a[j] = a[j+1];
                    a[j+1] = tmp;
                }
            }
        }
    }

    public static void main(String[] args){
        int[] a = {1,8,2,6,4,2,3,8,4,6,10,12,45,21,31,22,22,22,23,21,20,23,24,21,23,23};
        bubleSort(a);
        for(int i = 0;i<a.length;i++) {
            System.out.print(a[i]+"\t");
        }
    }

}      

二,基數排序

算法思路

  1. 最低位優先法,簡稱LSD法:先從最低位開始排序,再對次低位排序,直到對最高位排序後得到一個有序序列;
  2. 最高位優先法,簡稱MSD法:先從最高位開始排序,再逐個對各分組按次高位進行子排序,循環直到最低位。

算法分析

  1. 基數排序是穩定排序,在某些時候,基數排序法的效率高于其它的穩定性排序法。
  2. 時間複雜度:O(N)
  3. 空間複雜度:O(N)

算法實作

public class RadixSort {

    /**
     * 擷取待排序數組中的最大值
     * @param array
     * @return
     */
    private static int getMax(int[] array){

        int max = array[0];
        for(int i = 1;i<array.length;i++) {
            if (array[i] > max) {
                max = array[i];
            }
        }
        return max;
    }

    /**
     * 基數排序實作
     * @param arr
     * @param exp
     */
   private static void countSort(int arr[], int exp) {
        int n = arr.length;
        int output[] = new int[n];
        int i;
        int[] count = new int[10];
        count[0] = 0;
        for (i = 0; i < n; i++) {
            count[(arr[i] / exp) % 10]++;
        }

        for (i = 1; i < 10; i++) {
            count[i] += count[i - 1];
        }

        for (i = n - 1; i >= 0; i--) {
            output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
            count[ (arr[i]/exp)%10 ]--;
        }

        for (i = 0; i < n; i++) {
            arr[i] = output[i];
        }
    }

    /**
     * 基數排序 --- 時間複雜度O(N)
     * @param arr
     */
    public static void radixsort(int arr[]) {
        int n = arr.length;
        int m = getMax(arr);
        for (int exp = 1; m/exp > 0; exp *= 10) {
            countSort(arr,exp);
        }
    }

    public static void main(String[] args){
        int[] a = {1,8,2,6,4,2,3,8,4,6,10,12,45,21,31,22,22,22,23,21,20,23,24,21,23,23};
        radixsort(a);
        for(int i = 0;i<a.length;i++) {
            System.out.print(a[i]+"\t");
        }
    }
}      

繼續閱讀