数据结构 多关键字排序课设报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

一.设计题目 (2)

二.需求分析 (2)

1.程序设计问题描述 (2)

2.基本要求 (2)

3.流程图 (2)

三.详细设计 (3)

1.数据结构定义 (4)

2.主要算法设计 (5)

3.函数调用关系图 (8)

4.程序主要流程 (8)

四.调试分析 (13)

五.用户手册 (15)

六.测试结果 (19)

七.源代码(带注释) (21)

八.参考文献 (26)

一.设计题目

多关键字排序

二.需求分析

1.程序设计问题描述

多关键字的排序有其一定的实用范围。例如:在进行高考分数处理时,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。

2.基本要求

(1)假设待排序的记录数不超过10000,表中记录的关键字数不超过5,各个关键字的范围均为0至100。按用户给定的进行排序的关键字的优先关系,输出排序结果。

(2)约定按LSD法进行多关键字的排序。在对各个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用"分配"和"收集"的方法。并综合比较这两种策略。

(3)测试数据由随机数生成器产生。

3.流程图

三.详细设计

本程序是对语文,数学,英语,体育,综合这5门成绩按照此顺序进行优先排序。各科分数为0~100。

由于本实验约定按LSD进行多关键字的排序。在对个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用“分配”和“收集”的方法。所以在一个程序里实现了这两种排序方法。

第一种排序方法由于要使用稳定的排序方法,故参考书上的几种排序方法后,选用了冒泡排序和静态链表存储方式,每一趟排序后,找出最高分。第二种排序方法利用“分配”与“收集”的基数排序算法,用静态链表存储分数,在一趟排序中,将结点分配到相应的链

队列中去,再按从高到低链接起来。

1.数据结构设计

(1)稳定的内部排序法

结构体定义

typedef struct node //定义结构体

{

int key[5]; //数据域

struct node *next; //指针域

}*Score,Lnode;

基本操作

Score RandData(Score &L,int n)

初始条件:L为创建的静态链表,代表了一个学生成绩的记录,n为生成的随机数个数。

操作结果:随机生成n个数据并保存到链表L中,返回链表头指针。

Score BubbleSort(Score &L)

初始条件:L为创建的静态链表

操作结果:对链表进行冒泡降序排序,返回指针L。

void PrintScore(Score &L)

初始条件:L为创建的静态链表。

操作结果:在屏幕上显示链表。

(2)“分配”与“收集”的基数排序

结构体定义

typedef struct node //定义结构体

{

int key[5]; //数据域

struct node *next; //指针域

}*Score,Lnode;

基本操作

Score RadixSort(Score &L)

初始条件:L为创建的静态链表,代表了一条学生成绩的记录。

操作结果:对链表L的第n个关键字进行基数排序。

void PrintScore(Score &L)

初始条件:L为创建的静态链表。

操作结果:在屏幕上显示链表。

2.主要算法设计

(1)稳定的内部排序

Score BubbleSort(Score &L) //对链表进行冒泡降序排序,返回指针L

{

Score p,q,s,t,N;

int n;

t=(Score)malloc(sizeof(node));

N=(Score)malloc(sizeof(node));

N->next=L->next; //把N指向链表L

L->next=NULL; //L重新指向空

s=L; //创建新的链表L

while(N->next->next)

{

p=N->next;

q=p->next;

while(q)

{

n=0;

while(p->key[n]==q->key[n]&&n<5) //当前关键字相等则比较下一关键字

{n++;}

if(p->key[n]>q->key[n]) //交换数据域,指针域不变

{

for(int i=0;i<5;i++)

{

t->key[i]=q->key[i];

q->key[i]=p->key[i];

p->key[i]=t->key[i];

}

}

if(q->next==NULL) //当q指向最后一个结点时,将q插入到链表L的尾部

{

s->next=q;

s=s->next;

p->next=NULL; //p指向最后一个结点

}

p=p->next;

q=q->next;

}

}

s->next=N->next; //将第一个结点插到L的尾部

delete(N); //销毁指针N

return L;

}

(2)“分配”和“收集”的基数排序

Score RadixSort(Score &L) //对链表L的第n个关键字进行基数排序

{

Score head[radix],tail[radix],p,t;

int d,i,j,m;

for(int n=4;n>=0;n--)

{

for(d=1;d<=2;d++)

{

for(i=0;i

head[i]=tail[i]=NULL;

相关文档
最新文档