工作中遇到了计数排序,在网页上看了一会儿还没懂!可能是个人功底差了,这里自己笔录了网上的帖子,并添加了自己的理解注释:
计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。
一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素
具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。
计数排序的思想是:统计一个数序列中小于等于元素i的个数为n,则直接把该元素i放到输出
序列的第n个位置上。并将小于等于i的元素个数减减:n--
/*
FUNCTION :COUNTINGSORT,计数排序
input :A 待排序数组
array_size 数组A的元素个数
A数组中最大数为k
output :B 用于保存输出结果
return :NULL
other :
*/
//计数排序假设输入的元素都是0到k之间的整数。
void COUNTINGSORT(int *A, int *B, int array_size, int k)
{
int C[k+1], i, value, pos;
/*初始化C[i]为0*/
for(i=0; i<=k; i++)
{
C[i] = 0;
}
/*统计在排序序列A中,用C[i]统计为i的元素个数*/
for(i=0; i< array_size; i++)
{
C[A[i]] ++;
}
/*统计在排序序列A中,小于等于i的元素个数*/
for(i=1; i<=k; i++)
{
C[i] = C[i] + C[i-1];
}
/*
如果待排序数组A[i]的值为value,则在数组A中小于等于value为C[value].
故将value的值放在输出序列的C[value]的位置上,然后将C[value]--
*/
for(i=array_size-1; i>=0; i--)
{
value = A[i];
pos = C[value];
B[pos-1] = value;
C[value]--;
}
}