1. 程式人生 > >計數排序(Counting Sort)

計數排序(Counting Sort)

反向 length strong 填充 進行 tin 排序 等於 clas

計數排序的核心在於將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。 作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。

計數排序(Counting sort)是一種穩定的排序算法。計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。然後根據數組C來將A中的元素排到正確的位置。它只能對整數進行排序。

1. 算法描述

  • 找出待排序的數組中最大和最小的元素;
  • 統計數組中每個值為i的元素出現的次數,存入數組C的第i項;
  • 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
  • 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。

2. 代碼實現

public static int[] countingSort(int[] a){
        int min = a[0];
        int max = a[0];
        for (int i=0; i<a.length; i++){
            if (a[i] < min){
                min = a[i];
            }
            if (a[i] > max){
                max = a[i];
            }
        }
        
int[] b = new int[max - min +1]; int bias = min; for (int i = 0; i<a.length; i++){ b[a[i]-bias]++; } for (int i = 0, index=0; i < b.length; i++){ while(b[i] !=0){ a[index] = i+bias; b[i]--; index
++; } } return a; }

3. 算法分析

當輸入的元素是n 個0到k之間的整數時,它的運行時間是 O(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序算法。由於用來計數的數組C的長度取決於待排序數組中數據的範圍(等於待排序數組的最大值與最小值的差加上1),這使得計數排序對於數據範圍很大的數組,需要大量時間和內存。

最佳情況:T(n) = O(n+k) 最差情況:T(n) = O(n+k) 平均情況:T(n) = O(n+k)

計數排序(Counting Sort)