1、数据结构课程设计 基数排序算法演示 2.1 存储结构设计说明 3 2.2 主要算法流程图 43.1算法设计 53.2程序代码 74 调试分析 95 课设总结 106 参考文献 10 1 需求设计 1、题目:基数排序算法演示 2、说明:基数排序:通过LSD(最低为优先)法:先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的若干个堆,然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,直到用kn分配和收集之后,整个数据按多关键字位有序。2 概要设计 2.1存储结构设计
2、说明typedef struct /定义数据在存储类型 int key;data1; /类型标识符typedef struct /定义数据在存储类型 int keyd; /用数组存放数据个位数、十位数、百位数 int next; /指针域指向下一个数据形成链表结构data2; /类型标识符data1 Rmax;data2 R1max; /新类型数据2.2主要算法流程2-2主要算法流程图3 详细设计 3.1 算法设计(1)基数排序的“分配”与“收集”过程 :第一趟 : 图3-1第一趟演示基数排序的“分配”与“收集”过程 第二趟 : 图3-2第二趟演示基数排序的“分配”与“收集”过程 第三趟 :图
3、3-3 收集分配图示(2)基数排序过程阐述:设有n个记录,d个关键字,rd为基数,通过LSD(最低为优先)法:初始化一系列的空队列,先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的相应队列。然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,每一趟按一个关键值的位置记录分配到rd个队列中,同一链队列中的记录都是用链域指针链接起来的,所有的队头和队尾指针分别放在两个数组中,每一趟分配后通过修改指针将这个链队列中的记录收集起来;直到用kn分配和收集之后,重复分配和收
4、集d趟,便得到了最终排序好的有序序列。整个数据按多关键字位有序。3.2 程序代码#include stdio.h#define max 100#define rd 10#define d 3typedef struct /定义数据在存储类型 int key;data1; /类型标识符typedef struct /定义数据在存储类型 int keyd; /用数组存放数据个位数、十位数、百位数 int next; /指针域指向下一个数据形成链表结构data2; /类型标识符int jishusort(data2 R) /*基数排序函数*/ int frd,erd; /定义队列指示变量,分别指向队
5、列头和队列尾 int p=0,k,t; /定义指示变量p,和存放数据各位关键值(个位,十位,百位)的k,临时队尾存放用于收集数据的t for(int i=d;i=0;i-) /外层循环控制数的关键值(个位,十位,百位) for(int j=0;jrd;j+) /*内层循环一 初始化队列为空*/ fj=-1; ej=-1; while(p!=-1) /*内层循环二 数据按关键值分配至相应队列*/ k=Rp.keyi; /关键值赋予k if(fk=-1) /队列为空队列头指向当前数据 fk=p; else Rek.next=p; /队列不为空链接当前数据到队列尾 ek=p; /修改队列尾指向当前值
6、 p=Rp.next; /数据指示变量后移为分配下一数据做准备 int j=0; /刷新队列指示器,为数据收集做准备 while(fj=-1) /*内层循环三 数据收集*/ j+; /扫描到非空队列作为收集数据的 p=fj; /当前指示器指向队列首 t=ej; /临时存放保护队列尾便于下一队列链接上 while(jrd-1) /*内层循环四 收据数据链接成链表*/ j+; /扫描下一队列 if(fj!=-1) /队列非空则链接至数据收集链表 Rt.next=fj; /数据收集链表尾指针指向索扫描到队列的队列首 t=ej; /更改链表尾指针 Rt.next=-1; /收集数据完成,链表尾置空 r
7、eturn p;void choices(data1 R,int i) /选择开关(主界面) data2 R1max; /新类型数据 int gw,sw,bw; /定义关键值,个位数,十位数,百位数 int p; /定义p存放最终返回值,链表头 for(int m=0;mi;m+) gw=Rm.key%10; /个位数关键值由除10取整得 sw=(Rm.key%100)/10;/十位数由除百求余再除10取整得 bw=Rm.key/100; /百位数关键值由除100取余得 R1m.key2=gw; /以下分别将关键值赋予相应位置 R1m.key1=sw; R1m.key0=bw; R1m.nex
8、t=m+1; /各数据指针域初始化 int m; R1m.next=-1; /数据链表尾置空 p=jishusort(R1); /调用基数排序函数 while(p!=-1) /循环控制逐一打印排序后数列 printf(%d%d%d ,R1p.key0,R1p.key1,R1p.key2); p=R1p.next; printf(n);int main() /*主函数*/ int i=0; /局部变量用作结束输入 data1 Rmax; printf(请输入数据以-1结束:); scanf(%d,&Ri.key); while(Ri.key!=-1) /待排序数据输入 i+; printf(请输
9、入数据以-1结束:); scanf(%d,&Ri.key); choices(R,i); /调用主界面函数进行开关(操作)选择 return 0;4 调试分析 图4-1运行结果 图4-2运行结果图 按照提示输入任意一组整数,以-1结束,如图所示,程序成功运行,实现将一组数字进行基数排序。由于能力和时间的关系,程序部分没有包含处理不同类型的数据,只进行处理整形的数字排序,今后如果时间条件允许的话一定再进行详细的研究。5 课设总结通过这次课程设计,使我对数据结构这门课程有了更深一步的了解。它是计算机程序设计的重要理论技术基础,在我们计算机专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这
10、门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。课程设计是检验能力的重要环节,这能我们知识掌握更加牢固。在最开始接到课设题目时,由于没有具体的内容和要求,我就把它当做心里想的那样简单的编辑,结果只表现了一个不完全符合要求的简单排序,不能用特例来表示,经过老师的指正和引导,在同学的帮助探讨下又重新完成了一份,因为时间和能力的不足可能这个程序还并不是那么的完美,还请老师体谅。为此我也特别感谢此次设计对我有帮助的所有老师和同学。相信从课设当中学会的知识和收获,懂得的道理,对我以后的学习和生活都有帮助,我也会在不断经历中慢慢进步。6 参考文献1严蔚敏,吴伟民著. 数据结构:C语言版. 清华大学出版社,20072谭浩强著. C+面向对象程序设计. 北京:清华大学出版社,2006
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1