数据结构课程设计 基数排序算法演示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1 需求分析 (3)
2 概要设计 (3)
2.1 存储结构设计说明 (3)
2.2 主要算法流程图 (4)
3 详细设计 (5)
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存储结构设计说明
typedef struct //定义数据在存储类型
{
int key;
}data1; //类型标识符
typedef struct //定义数据在存储类型
{
int key[d]; //用数组存放数据个位数、十位数、百位数……
int next; //指针域指向下一个数据形成链表结构
}data2; //类型标识符
data1 R[max];
data2 R1[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"
#define max 100
#define rd 10
#define d 3
typedef struct //定义数据在存储类型
{
int key;
}data1; //类型标识符
typedef struct //定义数据在存储类型
{
int key[d]; //用数组存放数据个位数、十位数、百位数……
int next; //指针域指向下一个数据形成链表结构
}data2; //类型标识符
int jishusort(data2 R[]) /**********************************基数排序函数****************************/
{
int f[rd],e[rd]; //定义队列指示变量,分别指向队列头和队列尾
int p=0,k,t; //定义指示变量p,和存放数据各位关键值(个位,十位,百位……)的k,临时队尾存放用于收集数据的t
for(int i=d;i>=0;i--) //外层循环控制数的关键值(个位,十位,百位……)
{
for(int j=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; //数据指示变量后移为分配下一数据做准备 } int j=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; //收集数据完成,链表尾置空 } return p; } void choices(data1 R[],int i) //选择开关(主界面) { data2 R1[max]; //新类型数据 int gw,sw,bw; //定义关键值,个位数,十位数,百位数 int p; //定义p存放最终返回值,链表头 for(int m=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; //各数据指针域初始化 } int m; 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");