1、基本概念
计数排序是一种非比较算法,时间复杂度为O(N+K),N为数组数据的个数,K为最大最小数据之差。例如:int array[] = {2,4,1,7,5,3,2,9,6,0,5,1,8,0};一个含有14个元素数组,我们对它使用计数排序。排序前{2,4,1,7,5,3,2,9,6,0,5,1,8,0};排序后{0,0,1,1,2,2,3,4,5,5,6,7,8,9};原理:统计数组中每个元素出现的次数,通过计算最大最小值只差,计算出临时开辟空间大小,比最大最小值差大1。
2、代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int data[] = {2,4,1,7,5,3,2,9,6,0,5,1,8,0};
void sort_counter(int d[],int n,int k)
{
int i, j = 0;
k++;
int* counter = (int*)malloc(sizeof(int)*k);
memset(counter,0,sizeof(int)*k);
for(i = 0; i < n; ++i)
{
++counter[d[i]];
}
for(i = 0; i < k; ++i)
{
while(counter[i]-- >0)
{
d[j++] = i;
}
}
free(counter);
}
int main(void)
{
int i,j;
for(j = 0 ; j < 14; j++)
{
if(j == 0)
printf("排序前:%d ",data[j]);
else
printf("%d ",data[j]);
}
printf("\n");
sort_counter(data,14,9);
for(i = 0; i < 14; i++)
{
if(i == 0)
printf("排序后:%d ",data[i]);
else
printf("%d ",data[i]);
}
return 0;
}
3、打印结果
4、结论
计数排序的时间复杂度为O(N+K),当K相对较大,即数组元素最大最小值差较大,不适合使用此排序方法。比如:{0,1,999},即不适合。但是在N远远大于K时,还是非常合适的。