基本的思路就是假设输入序列中任意的元素x都满足x∈[0, k],且x和k都为整数。然后对每一元素x,都确定出序列中比它小的元素的个数,比如为n,则x排序后的位置就应当从n + 1处开始。实现的时候还需要考虑一些细节,比如序列中有几个元素大小相等,因此还需要对大小相等的元素个数进行计数,这样才能正确分配排序后各个元素的位置。
过程中用到了一个辅助序列C,C的大小为k + 1,从C[0]到C[k],它的索引i代表序列中可能出现的大小为i的数,C[i]表示这个数有多少个。
适用于待排序的每个元素都>=0。
计数排序是一种线性时间复杂度的排序, 时间复杂度O(n+k)
算法的步骤如下:
(1)找出待排序的数组中最大和最小的元素,以便确定C的长度k
(2)统计数组中每个值为i的元素出现的次数,存入数组C的第i项
(3)对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
(4)反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
主要代码如下:
memset(c,0,sizeof(c));
for(j=1;j<=n;j++)
c[a[j]]=c[a[j]]+1;//统计a数组中相同元素的个数
for(j=2;j<=k;j++)
c[j]=c[j]+c[j-1];//c[i]中包含等于或小于i的元素的个数
for(j=n;j>=1;j--)//把每个a[j]放到b的相应位置上
{
b[c[a[j]]]=a[j];
c[a[j]]=c[a[j]]-1;
}