C++代码,数据结构-内部排序-基数排序-链式基数排序
2014-03-19 17:59
423 查看
基数排序是一种从记录最次位关键字开始排序的方法,比如数据,从个位开始排序,具体的方法可以参照书上,我把书上的伪代码以可运行代码的形式呈现:
难点:书上 f e 数组的实现用了链表,节省了辅助空间,f数组的值只指向该位数第一个值在序列中的位置,该位数上的序列依靠记录本身带有的next指针来连接,e数组的值只指向该位数序列上最后一个值在序列上的位置。
难点:书上 f e 数组的实现用了链表,节省了辅助空间,f数组的值只指向该位数第一个值在序列中的位置,该位数上的序列依靠记录本身带有的next指针来连接,e数组的值只指向该位数序列上最后一个值在序列上的位置。
#include<iostream> #include<cstdlib> #include<fstream> #include<cstdlib> #include<ctime> using namespace std; #define Max_num_of_key 8 #define Radix 10 #define Max_space 51000 struct Slcell{ int keys[Max_num_of_key]; int data; int next; }; struct Slist{ Slcell r[Max_space]; int keymax; int length; }; typedef int Arrtype[Radix]; void buildslist(Slist &sl){//与前面不同,这里的记录多个一个keys用于记录每个data每一位上的数字,用于排序 cout<<"输入需要排序的数据数目和数据的最大位数"<<endl; cin>>sl.length>>sl.keymax; cout<<"依次输入数据"<<endl; for(int i=1;i<=sl.length;++i){ int x; cin>>x; sl.r[i].data=x; } for(int i=1;i<=sl.length;++i){//将每一位存储起来,低位对应低位 int x=sl.r[i].data; for(int j=1;j<=sl.keymax;++j){ sl.r[i].keys[j]=x%10; x/=10; } } } void Distribute(Slcell r[],int i,Arrtype &f,Arrtype&e){//按i位上的关键字分配 for(int j=0;j<Radix;++j)f[j]=0;//初始化f数组 for(int p=r[0].next;p;p=r[p].next){//从第一个记录开始 int j=r[p].keys[i];//用j记录次记录i位上的关键字 if(!f[j])f[j]=p;//f数组的j位上为0,则此数是第一个 else r[e[j]].next=p;//不然 此数排在f数组j位最后一个数后面 e[j]=p;//e数组j位重新赋值 } } void Collect(Slcell r[],int i,Arrtype &f,Arrtype&e){//对按i位关键字分配完的各子表进行收集, int j; for(j=0;!f[j];++j);//寻找第一个非空的子表 r[0].next=f[j]; int t=e[j];//头结点指向第一个结点 while(j<Radix-1){//不断寻找下一个非空子表 ++j; if(f[j]) {r[t].next=f[j];t=e[j];}//连接两个子表 } r[t].next=0;//最后一个结点指向0 } void Radixsort(Slist &L){//链表基数排序 Arrtype f,e; for(int i=0;i<L.length;++i) L.r[i].next=i+1;//先改造成静态链表 L.r[L.length].next=0;//最后一个位指向0,用于判定 for(int i=1;i<=L.keymax;++i){//序列中数字最大的位数为多少,则需要排序几次 Distribute(L.r,i,f,e);//按i位上的关键字分配, Collect(L.r,i,f,e);//对已按i位上一分配了的进行收集 } } int main(){ Slist sl; buildslist(sl);//建立记录表 Radixsort(sl); return 0; }
相关文章推荐
- C++代码,数据结构-内部排序-插入排序-直接插入排序
- C++代码,数据结构-内部排序-插入排序-2-路插入排序
- 数据结构_内部排序_链式基数排序
- C++代码,数据结构-内部排序-插入排序-表插入排序
- C++代码,数据结构-内部排序-交换排序-起泡排序
- C++代码,数据结构-内部排序-交换排序-快速排序
- C++代码,数据结构-内部排序-选择排序-堆排序
- C++代码,数据结构-内部排序-选择排序-归并排序
- 【数据结构】算法10.15-10.17 链式基数排序
- C++代码,数据结构-内部排序-插入排序-折半插入排序
- 数据结构 - 2-路插入排序 具体解释 及 代码(C++)
- 数据结构 - 只需选择排序(simple selection sort) 详细说明 和 代码(C++)
- 线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
- 数据结构 - 2-路插入排序 详解 及 代码(C++)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 数据结构——链式基数排序
- 数据结构 - 直接插入排序(Straight Insertion Sort) 详解 及 代码(C++)
- C++代码,数据结构-内部排序-插入排序-Shell排序
- 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版