数据结构排序综合课程设计报告

更新时间:2023-12-01 22:32:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《数据结构》 课程设计报告

专 业 计算机科学与技术 班 级 (1)

姓 名 王昕 学 号 20101308003 指导教师 顾韵华 起止时间 2011.10~2011.12

课程设计:排序综合

一、任务描述

(1)至少采用三种方法实现上述问题求解(提示,可采用的方法有插入排序、希尔排序、冒泡排序、快速排序、选择排序、堆排序、归并排序)。并把排序后的结果保存在不同的文件中。

(2)统计每一种排序方法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的方法。

二、问题分析

1、功能分析

分析设计课题的要求,要求编程实现以下功能:

(1)显示随机数:调用Dip()函数输出数组a[]。数组a[]中保存有随机产生的随机数。 (2)直接选择排序:通过n-I次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录交换之。

(3)冒泡排序:如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。

(4)希尔排序:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

(5)直接插入排序:将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表。设整个排序有n个数,则进行n-1趟插入,即:先将序列中的第1个记录看成是一个有序的子序列,然后从第2个记录起逐个进行插入,直至整个序列变成按关键字非递减有序列为止。

(6)显示各排序算法排序后的的数据和时间效率,并比较找出其中2种较快的方法。

2、数据对象分析

排序方式:直接选择排序、冒泡排序、希尔排序、直接插入排序

显示排序后的的数据和时间效率。

三、数据结构设计

1.主要全程变量及数据结构 数据结构:

typedef struct {

KeyType key; InfoType otherinfo;

}RedType; typedef struct {

RedType r[MAXSIZE+1];

int length;

}SqList;

2.算法的入口参数及说明 #include #define MAXSIZE 20

#define LT(a,b) ((a)<(b)) //宏定义

typedef int KeyType; //定义关键字KeyType为int typedef int InfoType; //定义关键字InfoType为int typedef struct{ //RedType结构定义 KeyType key;

InfoType otherinfo; //记录中其他信息域的类型 }RedType;

typedef struct{ //SqList结构定义 RedType r[MAXSIZE+1]; //定义大小 int length; //length为待排记录个数 }SqList;

四、功能设计

(一)主控菜单设计

为实现排序的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。

程序运行后,给出11个菜单项的内容和输入提示,如下:

欢迎来到排序综合系统! 菜单

(1)---直接插入排序 (2)---直接选择排序 (3)---冒泡排序 (4)---快速排序 (5)---堆排序

(6)---时间效率比较 (7)---显示随机数 (0)---退出系统

请在上述序号中选择一个并输入:

(二)程序模块结构

由课题要求可将程序划分为以下几个模块(即实现程序功能所需的函数): ? ? ? ? ?

(三)函数调用关系

主控菜单项选择函数menu_select() 插入排序函数:InsertSort() 选择排序函数:SelectSort() 冒泡排序函数:BubbleSort() 堆排序函数:heapsort()

程序的主要结构(函数调用关系)如下图所示。

其中main()是主函数,它进行菜单驱动,根据选择项1~0调用相应的函数。

(四)函数实现

#include #include #include #include #include #define N 30000

void Wrong() {

printf(\按键错误!\\n\getchar(); }

void Disp(int a[]) {

int i;

system(\

for(i=0;i

if((i-1)==9)

printf(\ printf(\

} }

void InsertSort(int a[],int p) //插入排序 {

int i,j,temp;

fclose(fp);return(time);

}

double Tquicksort(int a[],int n,int p) {

int i;

int b[N];

for(i=0;i

b[i]=a[i];

LARGE_INTEGER m_liPerfFreq={0};

QueryPerformanceFrequency(&m_liPerfFreq); LARGE_INTEGER m_liPerfStart={0};

QueryPerformanceCounter(&m_liPerfStart); quicksort(b,N,p);

LARGE_INTEGER liPerfNow={0};

QueryPerformanceCounter(&liPerfNow);

double time=liPerfNow.QuadPart - m_liPerfStart.QuadPart; time/=m_liPerfFreq.QuadPart; if(p!=6)

{Disp(b);getchar(); }

printf(\用快速排序法用的时间为%f秒;\

FILE *fp;fp=fopen(\快速排序.txt\ for(i=0;i

fprintf(fp,\

fclose(fp); return(time);

}

void BubleSort(double a[]) //时间数组的冒泡排序 {

int i,j; double temp;

for(i=1;i<6;i++) {

for(j=4;j>=i;j--) if(a[j+1]

temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; }

} }

void menu() {

printf(\欢迎来到排序综合系统! \\n\printf(\printf(\printf(\菜 单 \\n\printf(\printf(\printf(\直接插入排序 \\n\printf(\直接选择排序 \\n\printf(\冒泡排序 \\n\printf(\快速排序 \\n\printf(\堆排序 \\n\printf(\时间效率比较 \\n\printf(\显示随机数 \\n\printf(\退出系统 \\n\printf(\请在上述序号中选择一个并输入: \}

void main() {

int i,p,a[N];

srand((int)time(NULL)); /*随机种子*/

for(i=0;i

a[i]=rand()P000+1; while(1) {

system(\ menu();

scanf(\ if(p==0) {

printf(\>谢谢使用!\\n\ getchar(); break; }

double TIMES[5],TIMES1[5];//时间数组 switch(p) {

case 1:TInsertSort(a,p);printf(\请按任意键继续...\ case 2:TSelectSort(a,p);printf(\请按任意键继续...\ case 3:TBubbleSort(a,p);printf(\请按任意键继续...\ case 4:Tquicksort(a,N,p);printf(\请按任意键继续...\ case 5:Theapsort(a,N,p);printf(\请按任意键继续...\ case 6:system(\

TIMES1[1]=TIMES[1]=TInsertSort(a,p);TIMES1[2]=TIMES[2]=TSelectSort(a,p);

TIMES1[3]=TIMES[3]=TBubbleSort(a,p);TIMES1[4]=TIMES[4]=Tquicksort(a,N,p);TIMES1[5]=TIMES[5]=Theapsort(a,N,p);getchar(); BubleSort(TIMES); printf(\ {

printf(\排序这组数据两种较快的排序法分别是:\\n\ if(TIMES[1]==TIMES1[1]) printf(\直接插入排序:%f秒!\\n\

if(TIMES[1]==TIMES1[2]) printf(\直接选择排序:%f秒!\\n\ if(TIMES[1]==TIMES1[3]) printf(\冒泡排序:%f秒!\\n\

if(TIMES[1]==TIMES1[4]) printf(\快速排序:%f秒!\\n\ if(TIMES[1]==TIMES1[5]) printf(\堆排序:%f秒!\\n\ if(TIMES[1]!=TIMES[2])

{

if(TIMES[2]==TIMES1[1]) printf(\直接插入排序:%f秒!\\n\ if(TIMES[2]==TIMES1[2]) printf(\直接选择排序%f秒!\\n\ if(TIMES[2]==TIMES1[3]) printf(\冒泡排序%f秒!\\n\ if(TIMES[2]==TIMES1[4]) printf(\快速排序%f秒!\\n\ if(TIMES[2]==TIMES1[5]) printf(\堆排序%f秒!\\n\ }

} printf(\请按任意键继续...\

for(i=0;i

for(i=0;i

default:Wrong();printf(\请按任意键继续...\ } } }

五、测试数据和结果

本程序在VC++环境下实现,下面是对以上测试数据的运行结果。 (1) 主菜单显示如下:

(2)各分界面: 主菜单

测试

结果

六、结束语

在这次的数据结构课程设计中,排序综合,通过该题目的设计过程,加深了对排序算法的理解,对排序算法上基本运算的实现有所掌握,对课本中所学的各种数据结构进一步理解和掌握,学会了如何把学到的知识用于解决实际问题,锻炼了自己动手的能力。

本文来源:https://www.bwwdw.com/article/tcvt.html

Top