是一種穩定的排序算法。計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。而後根據數組C來將A中的元素排到正確的位置。ios
當輸入的元素是 n 個 0 到 k 之間的整數時,它的運行時間是 Θ(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序算法。算法
因爲用來計數的數組C的長度取決於待排序數組中數據的範圍(等於待排序數組的最大值與最小值的差加上1),這使得計數排序對於數據範圍很大的數組,須要大量時間和內存。例如:計數排序是用來排序0到100之間的數字的最好的算法,可是它不適合按字母順序排序人名。可是,計數排序能夠用在基數排序中的算法來排序數據範圍很大的數組。數組
通俗地理解,例若有10個年齡不一樣的人,統計出有8我的的年齡比A小,那A的年齡就排在第9位,用這個方法能夠獲得其餘每一個人的位置,也就排好了序。固然,年齡有重複時須要特殊處理(保證穩定性),這就是爲何最後要反向填充目標數組,以及將每一個數字的統計減去1的緣由。 算法的步驟以下:spa
#include<iostream> using namespace std; int data[13]={0,100,9,45,2,9,7,7,6,8,66,88,1230}; int myCountingSort(int ds[],int length){ int min=ds[0],max=ds[0];//找最大最小值 for(int i=0;i<length;i++){ if(ds[i]<min) min=ds[i]; if(ds[i]>max) max=ds[i]; } const int ls=max-min+1; int *countArr=(int *)malloc(sizeof(int)*ls); for(int i=0;i<ls;i++) countArr[i]=0; for(int i=0;i<length;i++) countArr[ds[i]-min]++;//計數 for(int i=0;i<ls;i++)//排序 while(0 != countArr[i]--){ //cout<<i+min<<" " ; static int j=0; ds[j++]=i+min; } return 0; } int main(){ myCountingSort(data,13); for(int i=0;i<13;i++) cout<<data[i]<<" "; getchar(); return 0; }