演算法-計數排序
阿新 • • 發佈:2021-08-11
計數排序
計數排序是一個非基於比較的排序演算法,該演算法於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 + " "); } } }