一、計數排序(Counting Sort)
計數排序是一種非比較型的排序算法,它的核心思想是:
利用“元素的值”來確定它在結果數組中的位置,通過“統計每個數出現的次數”來完成排序。
二、如何實現計數排序(核心步驟)
1、設有一個待排序數組?arr,長度為?n,值的范圍是?[min, max]。
2、找最大最小值,確定計數數組大小
3.?創建計數數組并統計頻次
4.?恢復到原數組(非穩定排序)
思維導圖
代碼實現
void Count_Sort(int* arr,int size){assert(arr);int min = arr[0];int max = arr[0];for(int i = 1;i<size;i++){if(arr[i]<min){min = arr[i];}if(arr[i]>max){max = arr[i];}}int Range = max-min+1;int index = 0;int* Count_Arr = (int*)calloc(Range,sizeof(int));for(int i = 0;i<size;i++){Count_Arr[arr[i]-min]++;};for(int j = 0;j<Range;j++){while (Count_Arr[j]--){arr[index++] = min+j;}}return; }
三、計數排序優缺點
項目 | 內容 |
---|---|
? 優點 | 時間復雜度為 O(n + k),非常快(k 為值域大小) |
? 非比較排序 | 不依賴比較操作(不像快排/歸并) |
? 適合大規模、密集整數排序 | |
? 缺點 | 只能處理?整數或可映射為整數?的數據,且值域不能太大(否則空間開銷太大) |
? 不適合有負數但未做映射處理的情況 | |
? 不是原地排序,需要額外空間 |
四、應用場景:
排序范圍已知、較小的數據(例如考試成績、年齡、投票數等)
多關鍵字排序中的一環(如基數排序的子排序)
五、所學習過的排序算法總結
穩定性的介紹:數組中相同值,排完序的相對順序是否可以做到不變,如果不變就是穩定的,如果會變化就是不穩定的。
排序算法 | 時間復雜度(平均/最壞) | 空間復雜度 | 穩定性 | 是否原地 | 適用場景簡述 |
---|---|---|---|---|---|
冒泡排序 | O(n2) / O(n2) | O(1) | ? 是 | ? 是 | 小數據、教學演示 |
選擇排序 | O(n2) / O(n2) | O(1) | ? 否 | ? 是 | 小數據、對穩定性無要求 |
插入排序 | O(n2) / O(n2) | O(1) | ? 是 | ? 是 | 幾乎有序或小數據量 |
希爾排序 | 介于 O(n) ~ O(n2) | O(1) | ? 否 | ? 是 | 中等規模數組 |
歸并排序 | O(n log n) / O(n log n) | O(n) | ? 是 | ? 否 | 大數據量、穩定性要求高 |
快速排序 | O(n log n) / O(n2) | O(log n) | ? 否 | ? 是 | 通用排序,性能優秀 |
堆排序 | O(n log n) / O(n log n) | O(1) | ? 否 | ? 是 | 內存有限,穩定性無要求 |
計數排序 | O(n + k) / O(n + k) | O(k) | ? 是 | ? 否 | 整數排序、值域小 |