教学课件 数据结构--赵仲孟.ppt

  1. 1、本文档共775页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法7.12:基数排序算法 int GetNDigit(int nNumber, int nIdx) { //求出第i趟时,某一个元素的第i位数。 for (int i = nIdx-1; i > 0; i--) { nNumber /= 10; } return nNumber % 10; } void Distribute(Element rec[],int n,int r,int d,int i,LinkList<Element>list[]){ // 初始条件:r为基数,d为关键字位数,list[0..r-1]为被分配的线性表数组 // 操作结果:进行第i趟分配 for(int j=0;j<n;j++) { //进行第i趟分配 int index=GetNDigit((rec[j]),i); list[index].Insert(list[index].length()+1,rec[j]); } } void Colect(Element rec[],int n,int r,int d,int i,LinkList<Element>list[]){ //初始条件:r为基数,d为关键字的位数,list[0..r-1]为被分配的线性表数组 //操作结果:进行第i趟收集 for(int k=0,j=0;j<r;j++) { //进行第i趟收集 Element tmpRec; while(!list[j].Empty()) { //收集list[j] list[j].Delete(1,tmpRec); rec[k++]=tmpRec; } } } void RadixSort(Element rec[],int n,int r,int d){ //初始条件:r为基数,d为关键字位数 //操作结果:对rec进行基数排序 LinkList<Element> *list; //用于存储被分配的线性表数组 list=new LinkList<Element>[r]; for(int i=1;i<=d;i++) { //第i趟分配与收集 Distribute(rec,n,r,d,i,list); //分配 Colect(rec,n,r,d,i,list); //收集 } delete []list; } 假设数组的长度为n,基数为r,关键字位数为d,则每趟分配的时间为O(n),每趟收集的时间为O(n+r),共需进行d趟分配与收集,因此总的时间代价为O(d(2n+r))。基数排序是稳定的排序方法,比较适合于d和r较小的数组。 7.5.2 多关键字排序 假设有n个待排序记录序列: { R[0],R[1],……,R[n-1]} 记录R[i]含有d个关键字(Ki0,Ki1,…,Kid-1),其中Ki0称为最主位关键字,Kid-1称为最次位关键字,如果对任意的两个记录R[i]和R[j](0≤i<j≤n-1)都满足: (Ki0,Ki1,…,Kid-1)≤(Kj0,Kj1,…,Kjd-1) 则称记录序列按关键字(K0,K1,…,Kd-1)有序。 多关键字序列的排序通常有两种方法,分别为最低位优先法LSF(Least Significant First)和最高位优先法MSF(Most Significant First)。本节只介绍经常使用的最低位优先法。最低位优先法的排序过程为:首先对最低位关键字Kd-1进行排序,然后再对高一位关键字Kd-2进行排序,依次类推,直到对K0进行排序为止。多关键字排序可以不比较关键字的大小,而是通过“分配”和“收集”来实现的。 以扑克牌排序为例解释多关键字排序思想。 每张扑克牌有两个“关键字”:花色和面值,花色是高位关键字,面值是低位关键字,假设有如下次序关系: 花色:?<?<?<? 面值:2<3<4<5<6<7<8<9<10<J<Q<K<A 可以通过采用如下的“分配”和“收集”来对扑克牌进行排序: 第1趟“分配”:按扑克牌的面值将扑克牌分配成不同面值的13堆。 第1趟“收集”:将这13堆扑克牌按面值自小到大收集起来(3收集在2的上面,4收集在3的上面,……,A收集在“K”的上面)。 第2趟“分配”:按扑克牌的花色分配成不同花色的4堆。 第2趟“收集”:将这4堆扑克牌按花色自小至大收集起来(?收集在?的上面,?收集在?的上面,?收集在?的上面)。 这样经过两趟“分配”和“收集”后便可得到如上次序关系的扑克牌。 使用这种排序方法对每一个关键字进行排序时,不需要再分组,而是整个记录组都参加排序。 7

文档评论(0)

喜宝 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档