数据结构课程设计基数排序算法演示.docx
- 文档编号:9584458
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:10
- 大小:164.73KB
数据结构课程设计基数排序算法演示.docx
《数据结构课程设计基数排序算法演示.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计基数排序算法演示.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构课程设计基数排序算法演示
2.1存储结构设计说明3
2.2主要算法流程图4
3.1算法设计5
3.2程序代码7
4调试分析9
5课设总结10
6参考文献10
1需求设计
1、题目:
基数排序算法演示
2、说明:
基数排序:
通过LSD(最低为优先)法:
先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的若干个堆,然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,直到用kn分配和收集之后,整个数据按多关键字位有序。
2概要设计
2.1存储结构设计说明
typedefstruct//定义数据在存储类型
{
intkey;
}data1;//类型标识符
typedefstruct//定义数据在存储类型
{
intkey[d];//用数组存放数据个位数、十位数、百位数……
intnext;//指针域指向下一个数据形成链表结构
}data2;//类型标识符
data1R[max];
data2R1[max];//新类型数据
2.2主要算法流程
2-2主要算法流程图
3详细设计
3.1算法设计
(1)基数排序的“分配”与“收集”过程:
第一趟:
图3-1第一趟演示
基数排序的“分配”与“收集”过程第二趟:
图3-2第二趟演示
基数排序的“分配”与“收集”过程第三趟:
图3-3收集分配图示
(2)基数排序过程阐述:
设有n个记录,d个关键字,rd为基数,通过LSD(最低为优先)法:
初始化一系列的空队列,先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的相应队列。
然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,每一趟按一个关键值的位置记录分配到rd个队列中,同一链队列中的记录都是用链域指针链接起来的,所有的队头和队尾指针分别放在两个数组中,每一趟分配后通过修改指针将这个链队列中的记录收集起来;直到用kn分配和收集之后,重复分配和收集d趟,便得到了最终排序好的有序序列。
整个数据按多关键字位有序。
3.2程序代码
#include"stdio.h"
#definemax100
#definerd10
#defined3
typedefstruct//定义数据在存储类型
{
intkey;
}data1;//类型标识符
typedefstruct//定义数据在存储类型
{
intkey[d];//用数组存放数据个位数、十位数、百位数……
intnext;//指针域指向下一个数据形成链表结构
}data2;//类型标识符
intjishusort(data2R[])/**********************************基数排序函数****************************/
{
intf[rd],e[rd];//定义队列指示变量,分别指向队列头和队列尾
intp=0,k,t;//定义指示变量p,和存放数据各位关键值(个位,十位,百位……)的k,临时队尾存放用于收集数据的t
for(inti=d;i>=0;i--)//外层循环控制数的关键值(个位,十位,百位……)
{
for(intj=0;j { f[j]=-1; e[j]=-1; } while(p! =-1)/******内层循环二数据按关键值分配至相应队列***/ { k=R[p].key[i];//关键值赋予k if(f[k]==-1)//队列为空队列头指向当前数据 f[k]=p; else R[e[k]].next=p;//队列不为空链接当前数据到队列尾 e[k]=p;//修改队列尾指向当前值 p=R[p].next;//数据指示变量后移为分配下一数据做准备 } intj=0;//刷新队列指示器,为数据收集做准备 while(f[j]==-1)/*********内层循环三数据收集******/ j++;//扫描到非空队列作为收集数据的 p=f[j];//当前指示器指向队列首 t=e[j];//临时存放保护队列尾便于下一队列链接上 while(j { j++;//扫描下一队列 if(f[j]! =-1)//队列非空则链接至数据收集链表 { R[t].next=f[j];//数据收集链表尾指针指向索扫描到队列的队列首 t=e[j];//更改链表尾指针 } } R[t].next=-1;//收集数据完成,链表尾置空 } returnp; } voidchoices(data1R[],inti)//选择开关(主界面) { data2R1[max];//新类型数据 intgw,sw,bw;//定义关键值,个位数,十位数,百位数 intp;//定义p存放最终返回值,链表头 for(intm=0;m { gw=R[m].key%10;//个位数关键值由除10取整得 sw=(R[m].key%100)/10;//十位数由除百求余再除10取整得 bw=R[m].key/100;//百位数关键值由除100取余得 R1[m].key[2]=gw;//以下分别将关键值赋予相应位置 R1[m].key[1]=sw; R1[m].key[0]=bw; R1[m].next=m+1;//各数据指针域初始化 } intm; R1[m].next=-1;//数据链表尾置空 p=jishusort(R1);//调用基数排序函数 while(p! =-1)//循环控制逐一打印排序后数列 { printf("%d%d%d",R1[p].key[0],R1[p].key[1],R1[p].key[2]); p=R1[p].next; } printf("\n"); } intmain()/***********主函数****************/ { inti=0;//局部变量用作结束输入 data1R[max]; printf("请输入数据以-1结束: "); scanf("%d",&R[i].key); while(R[i].key! =-1)//待排序数据输入 { i++; printf("请输入数据以-1结束: "); scanf("%d",&R[i].key); } choices(R,i);//调用主界面函数进行开关(操作)选择 return0; } 4调试分析 图4-1运行结果 图4-2运行结果图 按照提示输入任意一组整数,以-1结束,如图所示,程序成功运行,实现将一组数字进行基数排序。 由于能力和时间的关系,程序部分没有包含处理不同类型的数据,只进行处理整形的数字排序,今后如果时间条件允许的话一定再进行详细的研究。 5课设总结 通过这次课程设计,使我对《数据结构》这门课程有了更深一步的了解。 它是计算机程序设计的重要理论技术基础,在我们计算机专业的学习中占据着十分重要的地位。 同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。 因为我们学习知识就是为了实践。 而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。 课程设计是检验能力的重要环节,这能我们知识掌握更加牢固。 在最开始接到课设题目时,由于没有具体的内容和要求,我就把它当做心里想的那样简单的编辑,结果只表现了一个不完全符合要求的简单排序,不能用特例来表示,经过老师的指正和引导,在同学的帮助探讨下又重新完成了一份,因为时间和能力的不足可能这个程序还并不是那么的完美,还请老师体谅。 为此我也特别感谢此次设计对我有帮助的所有老师和同学。 相信从课设当中学会的知识和收获,懂得的道理,对我以后的学习和生活都有帮助,我也会在不断经历中慢慢进步。 6参考文献 [1]严蔚敏,吴伟民著.数据结构: C语言版.清华大学出版社,2007 [2]谭浩强著.C++面向对象程序设计.北京: 清华大学出版社,2006
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 基数排序算法演示 数据结构 课程设计 基数排序 算法 演示