基数排序--链式基数排序(Radix)

链式基数排序:属于”分配式排序”(distribution sort)基数排序法又称“桶子法”(bucket sort)或bin sort。
链式基数排序思想:透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。
时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(n),共进行d趟分配和收集。 空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针

/* THE BEGINNING OF RadixSort ----------------链式基数排序 */ template<class T> void InitSLList(SLList<T> &SL) { cout<<"Creat Static List /n Input the 数据个数:/n"; cin>>SL.recnum; SL.SList=new SLCell<T>[SL.recnum+1]; assert(SL.SList); cout<<"Input the 关键字 项数 /n"; cin>>SL.keynum; for(int i=1;i<=SL.recnum;i++) { SL.SList[i].keys=new T[SL.keynum+1]; assert(SL.SList[i].keys); } SL.SList[0].next=1; cout<<"Input 数据/n"; for(int i=1;i<=SL.recnum;i++) { cout<<"PLZ input the "<<i<<" th 数据/n"; for(int j=1;j<=SL.keynum;j++) { cin>>SL.SList[i].keys[j]; } if(i!=SL.recnum) SL.SList[i].next=i+1; else SL.SList[i].next=0; } } template <class T> void RelList(SLList<T> &SL) { for(int i=1;i<=SL.recnum;i++) delete SL.SList[i].keys; delete SL.SList; } template <class T> void Output2(SLList<T> &SL) { for(int i=SL.SList[0].next;i;i=SL.SList[i].next) { for(int j=1;j<=SL.keynum;j++) cout<<SL.SList[i].keys[j]; cout<<'/t'; } cout<<'/n'; } /* 按第i个关键字 keys[i] 建立 RADIX 个字表,使同一子表中记录的 keys[i] 相同 f[0...RADIX] 和 e[0...RADIX] 分别指向各个子表中第一个 和 最后一个记录 */ template <class T> void Distrbute(SLCell<T> *r ,int i,ArrType &f,ArrType& e) { int j; for(j=0;j<RADIX;j++) //各 子表 初始化为空 f[j]=0; for(int a=r[0].next;a;a=r[a].next) { j=r[a].keys[i]; if(!f[j]) f[j]=a; else r[e[j]].next=a; e[j]=a; } } /* 按 keys[i] 自小到大 将 f[0..RADIX] 所指 各个子表依次 链接成一个链表 */ template <class T> void Collect(SLCell<T> * r, int i, ArrType &f,ArrType &e) { int j; for(j=0;f[j];j++) //找第一个 非空子表 r[0].next=f[j]; //r[0].next 指向 第一个非空子表 中的第一个节点 int t=e[j]; while(j<RADIX) { for(j++;j<RADIX-1&&!f[j];j++); //找下一个非空子表 if(f[j]) //链接 两个非空子表 { r[t].next=f[j]; t=e[j]; } } r[t].next=0; //t指向 最后一个非空子表 中的 左右 一个结点 } template <class T> void RadixSort(SLList<T> &SL) { for(int i=SL.keynum;i>=1;i--)//对L作基数排序,使得L按关键字自小到大有序按最低位优先(先处理个位数,然后处理十位数……)一次对个关键字进行分配和收集 // for(int i=1;i<=SL.keynum;i++) //按最低位优先 { Distrbute(SL.SList,i,f,e); Collect(SL.SList,i,f,e); Output2(SL); } } /* END OF RadixSort ----------------链式基数排序 */

cout<<" * 基数排序 */n" <<"0 退出基数排序/n" <<"1 链式基数排序/n"; cout<<"请选择基数排序函数:/n"; cin>>choice5; while(choice5!=5) { switch(choice5) { case 1: //链式基数排序 SLList<int> SL; InitSLList(SL); cout<<"链式基数排序输入:/n"; Output2(SL); RadixSort(SL); cout<<"链式基数排序结果如下:/n"; Output2(SL); RelList(SL); break; } cout<<" * 基数排序 */n" <<"0 退出基数排序/n" <<"1 链式基数排序/n"; cout<<"请选择基数排序函数:/n"; cin>>choice5; } break; //end of fil3==5,链式基数排序

以下是 最低位 优先 的结果:

未命名6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值