计数排序


    基本的思路就是假设输入序列中任意的元素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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值