基数排序:将记录的关键字看成由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;