計數排序是一種非比較的排序算法,它的思想其實很簡單,就是先開闢一塊空間用來存放數據出現的次數,然後就要統計出數據出現的次數,並將其放在對應的位置下標上,最後我們可以根據統計的次數依次還原出來就有序了,如下圖分析:
代碼實現:
void CountSort(int* a,int n)
{
assert(a);
int max=a[0];
int min=a[0];
//1.先統計數據中的最大值和最小值,然後確定範圍
for(int i=0;i<n;++i)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
int range=max-min+1;
int* count=new int[range]; //用來存放數據出現的次數
memset(count,0,sizeof(int)*range);
//2.遍歷數據放在對應的位置
for(int i=0;i<n;++i)
{
count[a[i]-min]++;
}
//3.將數據按統計的次數依次還原
int index=0;
for(int i=0;i<range;++i)
{
while(count[i]--)
{
a[index++]=i+min;
}
}
delete[] count;
}
計數排序,在數據範圍比較大或是數據太過分散的時候佔用空間就很大,這種情況就不太適用,而且只能對無符號數進行排序(沒有比較),但是它有一個很明顯的優勢是:在數據範圍較集中時,排序效率是相當高的。
時間複雜度爲O(N+範圍),空間複雜度爲O(範圍)。