计数排序是一种非比较的排序算法,它的思想其实很简单,就是先开辟一块空间用来存放数据出现的次数,然后就要统计出数据出现的次数,并将其放在对应的位置下标上,最后我们可以根据统计的次数依次还原出来就有序了,如下图分析:
代码实现:
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(范围)。