数据结构课程设计基数排序算法演示.docx

上传人:b****8 文档编号:9584458 上传时间:2023-02-05 格式:DOCX 页数:10 大小:164.73KB
下载 相关 举报
数据结构课程设计基数排序算法演示.docx_第1页
第1页 / 共10页
数据结构课程设计基数排序算法演示.docx_第2页
第2页 / 共10页
数据结构课程设计基数排序算法演示.docx_第3页
第3页 / 共10页
数据结构课程设计基数排序算法演示.docx_第4页
第4页 / 共10页
数据结构课程设计基数排序算法演示.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据结构课程设计基数排序算法演示.docx

《数据结构课程设计基数排序算法演示.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计基数排序算法演示.docx(10页珍藏版)》请在冰豆网上搜索。

数据结构课程设计基数排序算法演示.docx

数据结构课程设计基数排序算法演示

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

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 日语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1