16. 蛤蟆的数据构进阶十六排序实现之基数排序.docxVIP

16. 蛤蟆的数据构进阶十六排序实现之基数排序.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
16. 蛤蟆的数据构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:“社会犹如一条船 , 每人都要有掌舵的准备。--易卜生” 我们来看下基数排序。 基数排序  HYPERLINK /view/1170573.htm \t _blank 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的HYPERLINK /view/2914896.htm \t _blank元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其HYPERLINK /view/104946.htm \t _blank时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。 基数排序不需要进行记录关键字间的比较。基数排序是 一种借助多关键字排序的思想对逻辑关键字进行排序的方法。 基数排序是通过“分配”和“收集”过程来实现排序。 假设有欲排数据序列如下所示: 73? 22? 93? 43? 55? 14? 28? 65? 39? 81 首先根据个位数的数值,在遍历数据时将它们各自分配到编号0至9的桶(个位数值与桶号一一对应)中。 分配结果(逻辑想象)如下图所示: 分配结束后。接下来将所有桶中所盛数据按照桶号由小到大(桶中由顶至底)依次重新收集串起来,得到如下仍然无序的数据序列: 81? 22? 73? 93? 43? 14? 55? 65? 28? 39 接着,再进行一次分配,这次根据十位数值来分配(原理同上),分配结果(逻辑想象)如下图所示: 分配结束后。接下来再将所有桶中所盛的数据(原理同上)依次重新收集串接起来,得到如下的数据序列: 14? 22? 28? 39? 43? 55? 65? 73? 81? 93 观察可以看到,此时原无序数据序列已经排序完毕。如果排序的数据序列有三位数以上的数据,则重复进行以上的动作直至最高位数为止。 代码实现 主要部分代码: 首先申请一个存放基数的空间,空间大小为元素个数大小总和。 初始化倍数基数为1. 处理第一次循环的时候,基数为10 (即nRadixBase). 将处理的数组放入到nDataRadix中(获取元素中的其中一个值)。 nDataRadix[i] = nPData[i] % nRadixBase; nDataRadix[i] /= nRadixBase / 10; 然后调用RadixCountSort函数进行分配。 处理基数为100,处理百位的数。以此循环。 最后释放申请的辅助空间。 最后如下图1: RadixCountSort 分配保存计数的个数的数组(个数由所调函数传入)pnCount。 分配保存存放零时的排序结果的数组pnSort。 初始化个数数组pnCount。 pnCount记录数据各元素当前处理位拥有的数量。 处理前数组:{73,22,93, 43, 55,14,28,65, 39, 81}; npIndex数组(即元素的余数数组): 3 ,2,3,3,5,4,8,5,9,1 当第一轮处理完毕后 余数为0: 余数为1:81 余数为2:22 余数为3:73 93 43 余数为4:14 余数为5:55 65 余数为6: 余数为7: 余数为8:28 余数为9:39 pnCount :0,1,2,5,6,8,8,8,9,10 处理完毕后得到数组:81,22,73,93,43,14,55,65,28,39 按照个位数大小进行了排序。 将一轮处理完的数组赋值给最后的数组。 最后释放pnSort,pnCount 源码 #includestdio.h #include stdlib.h #define N 10 int RadixCountSort(int* npIndex, int nMax, int* npData, int nLen) { int* pnCount = (int*)malloc(sizeof(int)* nMax); //保存计数的个数 int i=0; for (i = 0; i nMax; ++i) { pnCount[i] = 0; } for (i = 0; i nLen; ++i) //初始化计数个数 { ++pnCount[npIndex[i]]; } for (i = 1; i 10; ++i) //确定不大于该位置的个数。 { pnCount[

文档评论(0)

canggu808866 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档