**计数排序(Count Sort)**是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。
计数排序的思想类似于哈希表中的直接定址法,在给定的一组序列中,先找出该序列中的最大值和最小值,从而确定需要开辟多大的辅助空间,每一个数在对应的辅助空间中都有唯一的下标。
计数排序的思路如下
1、找出序列中最大值和最小值,开辟Max-Min+1的辅助空间
2、最小的数对应下标为0的位置,遇到一个数就给对应下标处的值+1,。
3、遍历一遍辅助空间,就可以得到有序的一组序列
代码实现如下
void CountSort(int* arr, int n)
{
int i = 0;
int index = 0;
int range = 0;
int* count = NULL;
int max = arr[0];
int min = arr[0];
//遍历原数组找出最大值和最小值
for(i=0; i<n; i++)
{
if(arr[i] > max)
{
max = arr[i];
}
if(arr[i] < min)
{
min = arr[i];
}
}
range = max - min + 1;//需要开辟空间的大小
count = (int*)malloc(sizeof(int)*range);
memset(count,0,sizeof(int)*range);//把辅助空间初始化为0
for(i=0; i<n; i++)
{
count[arr[i]-min]++;//arr[j]-min是原数组中的对应到辅助空间下标
}
for(i=0; i<range; i++)//遍历辅助空间
{
while(count[i]--)//下标处的值是几,说明该数出现了几次
{
arr[index] = i + min;//将下标出的数放回原数组
index++;
}
}
free(count);
count = NULL;
}