数据结构课程设计基数排序算法演示.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