数据结构设计任务书.docx

上传人:b****5 文档编号:11764929 上传时间:2023-04-01 格式:DOCX 页数:12 大小:176.65KB
下载 相关 举报
数据结构设计任务书.docx_第1页
第1页 / 共12页
数据结构设计任务书.docx_第2页
第2页 / 共12页
数据结构设计任务书.docx_第3页
第3页 / 共12页
数据结构设计任务书.docx_第4页
第4页 / 共12页
数据结构设计任务书.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构设计任务书.docx

《数据结构设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构设计任务书.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构设计任务书.docx

数据结构设计任务书

学号:

课程设计

 

题目

交换排序的设计与实现

学院

计算机科学与技术学院

专业

班级

姓名

指导教师

 

2012

1

2

课程设计任务书

学生姓名:

专业班级:

指导教师:

工作单位:

题目:

交换排序的设计与实现

初始条件:

理论:

学习了《数据结构》课程,掌握了一种计算机高级语言。

实践:

计算机技术系实验中心提供计算机及软件开发环境。

要求完成的主要任务:

(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

1、系统应具备的功能:

(1)随机产生10个和1000个数据

(2)实现起泡排序和快速排序

(3)比较各种交换排序的优劣

2、数据结构设计;

3、主要算法设计;

4、编程及上机实现;

5、撰写课程设计报告,包括:

(1)设计题目;

(2)摘要和关键字(中文和英文);

(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术的讨论、设计体会等;

(4)结束语;

(5)参考文献。

时间安排:

2012年1月2日-6日(第18周)

1月2日查阅资料

1月3日系统设计,数据结构设计,算法设计

1月4日-5日编程并上机调试

1月6日撰写报告

1月7日验收程序,提交设计报告书。

指导教师签名:

2012年1月2日

系主任(或责任教师)签名:

年月日

目录

摘要..............................................3

Abstract..........................................4

1引言.............................................5

1.1起泡排序.....................................5

1.2快速排序.....................................5

2需求分析.........................................6

2.1产生随机数...................................6

2.2输出执行时间.................................6

2.3对关键字排序.................................6

2.3.1起泡排序.................................6

2.3.2快速排序.................................6

2.4数据结构.....................................6

4程序(算法)设计分析.............................7

4.1起泡排序.....................................7

4.2快速排序.....................................8

4.3运行结果....................................10

4.4结果分析....................................11

5有关技术的讨论..................................12

6设计体会(结束语)..............................13

参考文献

摘要交换排序最基本简单的就是起泡排序了,基于起泡排序的优化算法又有双向起泡排序。

而除起泡排序之外,快速也是很常见的交换排序算法。

关键字记录、排序、枢轴、有序、分治法.

 

AbstractExchangesortisthemostbasicsimplebubblesort,andbubblesortbasedoptimizationalgorithmshavebi-directionalbubblesort.Andinadditiontobubblesort,thefast-exchangeisalsoverycommonsortingalgorithms.

Keywordsrecord、Sort、pivot、order、thedivideandconquermethod.

 

1引言

1.1起泡排序

起泡排序过程很简单。

首先将第一个关键字和第二个关键字进行比较,若为逆序,则将两关键字交换,然后比较第二个和第三个关键字,依此类推,直至第n-1个和第n个关键字相比较,结果使最大的关键字被安置到最后一个位置上,此为一趟起泡排序。

然后开始第二趟起泡排序,其结果是将次大的关键字被安置到第n-1个位置上,以此类推,直至序列有序。

1.2快速排序

交换排序是一种效率很好的排序方法,适用于排序问题的规模很大但对于稳定性不作要求的情况。

它的设计方法是分治法,基本思想是:

在待排序列中选择一个对象作为枢轴,然后进行一趟快速排序,将序列分割为两个子序列,一个子序列的所有对象都不大于枢轴,一个都不小于枢轴。

然后便对这两序列重复上面的操作,依此类推,直至所有对象都被确定了位置,即序列有序。

 

2需求分析

本系统主要有三个功能:

产生随机关键字,记录排序与程序运行的时间和对关键字进行排序等工作。

2.1产生随机数

系统要求产生1000个以上的数据,故采用随机函数rand来实现,在主函数头文件中包含time.h和stdlib.h。

系统中采用srand函数来对随机函数rand进行初始化,产生的随机数用一维数组来存储。

2.2输出执行时间

本实验要求比较两种交换排序的优劣,其主要评判标准(空间复杂度相差很小,只是快速排序比起泡排序多了一个枢轴暂寄单位元)是时间复杂度。

《数据结构》中理论的分析了它们排序所用时间,而此实验用具体数据论证。

需用到时间函数clock,用以返回程序执行到此处时的时刻,并定义几个clock_t类型的数据来存储,两者相减即为所用时间。

2.3对关键字排序

2.3.1起泡排序

对于n个关键字的起泡排序,共要进行n-1趟的排序,第i趟要对n-i+1个关键字进行排序,即key[0]到key[n-i],可知共有两层循环。

在每一次的排序中,都定义一个临时变量temp,用以作为关键字交换时的临时存储单元。

2.3.2快速排序

快速排序中需要选取一个枢轴(pivot),枢轴不需要随着关键字移动,故可将它暂寄在key[0],还需要定义两个指针low和high。

排序分两个函数实现,一个是递归形式的快速排序,另一个是一趟快速排序。

在对由枢轴分割的子序列进行排序时,依赖于前者对后者的调用来实现,后者完成具体的排序过程。

2.4数据结构

待排序关键字用一维数组存储

#defineN50000

intkey[N];

 

3程序(算法)设计分析

4.1起泡排序

对n个关键字进行排序,共要进行n-1趟,第i趟要对n-i+1个关键字进行排序。

在每一次的排序中,都定义一个临时变量temp,用以作为关键字交换时的临时存储单元。

用随机函数rand产生随机数,时间函数clock返回时刻,clock_t类型的数据记录时间。

#include

#include

#include

#defineN1000

voidmain()

{

clock_tstart_1,start,finish_1,finish;//定义四个clock_t类型的数据,用以记录时刻

start=clock();//记录程序开始运行时刻

doubleduration_1,duration;/*用以记录时间*/

time_tt;

intkey[N],temp=0;

srand(unsignedint(time(&t)));//初始化随机函数

for(inti=0;i

key[i]=rand()%8001+1000;//向数组中输入N个1000~9000的随机数

start_1=clock();//记录起泡排序开始时刻

for(intj=0;j

for(intk=0;k

if(key[k]>key[k+1])

{

temp=key[k];

key[k]=key[k+1];

key[k+1]=temp;

}

finish_1=clock();//记录起泡排序结束时刻

printf("现在输出排序后的关键字序列:

\n");

for(intd=0;d

printf("%d",key[d]);

printf("\n-------------------------\n起泡排序所用时间:

");

duration_1=double(finish_1-start_1)/CLOCKS_PER_SEC;

printf("%fs\n",duration_1);

printf("\n-------------------------\n整个程序运行所用时间:

");

finish=clock();//记录程序运行结束时刻

duration=double(finish-start)/CLOCKS_PER_SEC;

printf("%fs\n",duration);}

4.2快速排序

需要选取一个枢轴(pivot),枢轴不需移动,故将它暂寄在key[0],另外定义两指针low和high。

排序分两个函数实现,一个是递归形式的快速排序,另一个是一趟快速排序。

在对由枢轴分割的子序列进行排序时,依赖于前者对后者的调用来实现,后者完成具体的排序过程。

用随机函数rand产生随机数,时间函数clock返回时刻,clock_t类型的数据记录时间。

#include

#include

#include

#defineN1000

/*------------进行一趟快速排序-------------*/

intpartition(intkey[],intlow,inthigh)

{

key[0]=key[low];//将枢轴暂寄于key[0]

intpivotkey=key[low];

while(low

{

while(low=pivotkey)

--high;

key[low]=key[high];//将小于枢轴的元素移到低位

while(low

++low;

key[high]=key[low];//将大于枢轴的元素移到高位

}

key[low]=key[0];

returnlow;//返回枢轴所在位置

}

/*------------递归形式的快速排序-----------*/

voidQsort(intkey[],intlow,inthigh)

{

if(low

{

intpivotloc=partition(key,low,high);//pivotloc是枢轴

Qsort(key,low,pivotloc-1);//对低于枢轴的关键字进行递归排序

Qsort(key,pivotloc+1,high);//对高于枢轴的关键字进行递归排序

}

}

/*-------------主函数main----------------*/

voidmain()

{

clock_tstart,start_1,finish,finish_1;//定义四个clock_t类型的数据,用以记录时刻

start=clock();//记录程序开始运行时刻

doubleduration,duration_1;

intkey[N+1];

intlow=1,high=N;

time_tt;

srand(unsignedint(time(&t)));//初始化随机函数

for(inti=1;i

key[i]=rand()%8001+1000;//向数组中输入N个从1000~9000的随机数

start_1=clock();//记录快速排序开始时刻

Qsort(key,low,high);

finish_1=clock();//记录快速排序结束时刻

printf("现在输出排序后的关键字序列:

\n");

for(intj=1;j

printf("%d",key[j]);

printf("\n------------------------------------------\n快速排序所用时间:

");

duration_1=double(finish_1-start_1)/CLOCKS_PER_SEC;

printf("%fs\n",duration_1);

printf("\n------------------------------------------\n整个程序运行所用的时间:

");

finish=clock();//记录程序运行结束时刻

duration=double(finish-start)/CLOCKS_PER_SEC;

printf("%fs\n",duration);

}

 

4.3运行结果

声明:

由于在实验过程中10个以及1000个数据并不多,致使快速排序中排序的时间测不出来,因而将它设为50000个。

起泡排序结果

快速排序结果

4.4结果分析

在VS2010软件下,取N=50000个数,并各自运行10次,得到的数据如下:

起泡排序所用平均时间aver_time1:

10.297800s.

起泡排序整个程序执行所用平均时间B_aver_time:

16.862200s.

快速排序所用平均时间aver_time2:

0.012000s.

快速排序整个程序执行所用平均时间Q_aver_time:

6.621200s.

起泡排序时间占整个程序执行时间百分比:

aver_time1/B_aver_time=(10.2978/16.8622)*100%=61.07%.

快速排序时间占整个程序执行时间百分比:

aver_time2/Q_aver_time=(0.012/6.6212)*100%=0.18%.

快速排序对起泡排序效率的倍数:

aver_time1/aver_time2=10.2978/0.012=858.15.

由数据可发现:

起泡排序中,大部分的时间(占61.07%)都用在对关键字的排序上;而在快速排序中,只有很小部分的时间(只占0.18%)花在排序上,绝大部分时间都花在输出等其他方面。

另外,在同等条件下,快速排序的效率是起泡排序的858.15倍,将近900倍。

 

5有关技术的讨论

本程序由于所要排序的数较多,要用到随机函数,产生足够多的随机数;要比较两种交换排序的优劣,则要从时间复杂度方面考察,故引入时间函数,得到排序及程序执行的时间,以便比较。

 

6设计体会(结束语)

在设计本程序的过程中,对于排序算法有了更深入的了解,并能从时间复杂度和空间复杂度方面对算法的优劣进行判断,特别是设计过程中遇到的困难,让自己学到了很多。

 

参考文献

[1]《数据结构》(C语言版),严蔚敏,清华大学,2006年10月版。

[2]XX百科《随机函数》和《时间函数》。

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

当前位置:首页 > 幼儿教育 > 育儿理论经验

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

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