1. 程式人生 > 其它 >演算法-計數排序

演算法-計數排序

計數排序

計數排序是一個非基於比較的排序演算法,該演算法於1954年由 Harold H. Seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為Ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法。 [1] 當然這是一種犧牲空間換取時間的做法,而且當O(k)>O(nlog(n))的時候其效率反而不如基於比較的排序(基於比較的排序的時間複雜度在理論上的下限是O(nlog(n)), 如歸併排序,堆排序)

演算法步驟

  • 找到陣列arr 中的最大值為 max
  • 建立一個桶陣列bucket=int[max+1] , i代表的是就是arr裡面的值,value就是arr 出現的個數
  • 統計陣列中每個值為i的元素出現的次數,存入陣列的第i項
  • 反向填充目標陣列arr ,遍歷 bucket 值大於0的就往arr反向填充

演示

程式碼



public class CountSort {

    public static int[] countSort(int[] arr) {

        // step 1: 找到最大值
        int max = Integer.MIN_VALUE;
        for (int i : arr) {
            max = Math.max(max, i);
        }

        // step 2:建立桶陣列
        int[] bucket = new int[max + 1];
        for (int i : arr) {
            bucket[i]++;
        }

        int index = 0;
        // step 3: 將桶中的數倒出
        for (int i = 0; i < bucket.length; i++) {
            while (bucket[i] > 0) {
                arr[index++] = i;
                bucket[i]--;
            }
        }
        return arr;
    }

    public static void main(String[] args) {
        int[] arr = {7, 1, 5, 9, 3, 11, 55, 33, 8, 16};
        final int[] arr2 = countSort(arr);
        for (int i : arr2) {
            System.out.print(i + " ");
        }
    }
}