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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

相关文档
最新文档