- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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[
您可能关注的文档
- 1.《大连市社会科院2012度立项课题指南》.doc
- 1.《JSP动态网程序设计》课程设计说明书模板.doc
- 1.Good afernoon ladies and gentlemen.doc
- 1.中国平安财产保股份有限公司个人贷款保证保险(A款)条款、费率.doc
- 1.内蒙古师范大学予硕士专业学位登记表(在职研究生填写).doc
- 1.地铁基坑围护结工程施工监理实施细则.doc
- 1.急性ST段抬高肌梗死患者医疗救治技术方案.docx
- 1.示范教案(3..1 两角差的余弦公式).doc
- 1.河南科技大学自助学实践性环节考核工作实施细则.doc
- 1.罗文个人对照检材料21稿2014.6.13.doc
原创力文档


文档评论(0)