数据结构设计任务书.docx
- 文档编号:11764929
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:12
- 大小:176.65KB
数据结构设计任务书.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;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 --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百科《随机函数》和《时间函数》。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构设计 任务书