计数基数排序法

基数排序:将记录的关键字看成由m个关键字复合而成,每个关键字可能取r个值,则只要从最低位关键字器,先按关键字的不同值将记录“分配”到r 个子序列,再按从小到大将各子序列依次首尾相接“收集”在一起,如此重复m趟,最终完成整个记录序列的排序。
例如:分扑克牌,先把每张牌分为4个花色,各自排序后,以黑桃到砖块的顺序相接在一起。

基数排序分为链式基数排序和计数基数排序。
计数基数排序是在顺序存储结构中实现。在每一趟,分配是对相应关键字的每种取值计数(即统计r个子序列的长度)count,确定每个子序列的起始位置pos;收集是根据各子序列的起始位置将记录复制到合适位置。

基本思路:
1、 按照每位数的顺序进行排序,从个位到十位到百位。
2、 排序的过程:例如个位,先计算每个个数出现的次数,放在count[]中。再把每个位数的起始位置计算出来,放在pos[]中。计算完后,即可根据pos进行收集。
3、 list为原数组,list1为辅助数组。收集来的数传到list1中。第二次放在list中。如此重复,如果最后数据还放在list1中,那则需要把list1的数据复制到list中。

举个栗子:现在有数组list={113,323,624,631}要进行计数基数排序

第一趟排序,对个位进行排序,排序完的数据放在list1中。可看到此时个位数已经有序。
这里写图片描述

第二趟排序,对十位进行排序,排序完的数据放在list中。可看到此时十位数已经有序。
(其实此时已经排好序了,但是为了说明函数继续说下去)
这里写图片描述

第三趟排序,对百位进行排序,排序完的数据放在list1中。

这里写图片描述

最后就能得到排序好的数组list={113,323,624,631}

代码实现:

typedef struct List
{
    int digNum;     //数字位数
    int length;     
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值