一.什么是计数排序
计数排序又称为鸽巢原理,它是对哈希直接定址法的变形应用。计数排序是一种非比较
的排序算法,其核心在于将输入的数据值
转化为键
存储在额外开辟
的数组空间中。这说明计数排序只适合用于比较数据较为集中的数据,如果数据太过分散是非常浪费空间的。
二.具体实现步骤
- 1.统计所有相同数据出现的次数
- 2.根据统计的次数将序列放回到原来的数组返回
三.代码实现
void CountSort(int* num,int len)
{
if(num==NULL||len<=0)
return;
int min=num[0],max=num[0];
int i=0;
for(;i<len;i++)
{
if(num[i]<min)
min=num[i];
if(num[i]>max)
max=num[i];
}
int range=max-min+1;
int* tmp=(int*)malloc(sizeof(int)*range);
if(tmp==NULL)
{
perror("use malloc");
exit(1);
}
memset(tmp,0,sizeof(int)*range);
for(i=0;i<len;i++)
{
tmp[num[i]-min]++;
}
int index=0;
for(i=0;i<range;i++)
{
while((tmp[i]--)!=0)
{
num[index]=i+min;
index++;
}
}
}
四.效率分析
- 计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k)。
- 空间复杂度也是(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法。