数据结构设计任务书.docx
《数据结构设计任务书.docx》由会员分享,可在线阅读,更多相关《数据结构设计任务书.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构设计任务书
学号:
课程设计
题目
交换排序的设计与实现
学院
计算机科学与技术学院
专业
班级
姓名
指导教师
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;ikey[i]=rand()%8001+1000;//向数组中输入N个1000~9000的随机数
start_1=clock();//记录起泡排序开始时刻
for(intj=0;jfor(intk=0;kif(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;dprintf("%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;ikey[i]=rand()%8001+1000;//向数组中输入N个从1000~9000的随机数
start_1=clock();//记录快速排序开始时刻
Qsort(key,low,high);
finish_1=clock();//记录快速排序结束时刻
printf("现在输出排序后的关键字序列:
\n");
for(intj=1;jprintf("%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百科《随机函数》和《时间函数》。