ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:1.22MB ,
资源ID:8205906      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8205906.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(七种排序算法的比较及每种排序的上机统计时间.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

七种排序算法的比较及每种排序的上机统计时间.docx

1、七种排序算法的比较及每种排序的上机统计时间数据结构课程设计报告课题: 排序算法的比较学院:信息学院班级: 2011级电子信息工程1班小组成员:韦志东(组长) 20111601310027 夏琪 20111601310028完成时间: 2014-01-08教师:周铁目录1、课程分析 21.1、选题 21.2、选题的意义及背景 2 1.3、设计任务书22、设计分析 22.1、原始数据 22.2、输出数据 22.3、程序流程图 33、程序源代码及注释 34、测试结果 125、总结 266、参考文献 277、小组人员分工 271、课程分析1.1、选题要求利用随机函数产生30000个随机整数,利用直接插

2、入排序、希尔排序,冒泡排序、直接选择排序、快速排序、堆排序、归并排序的排序方法进行排序,并统计每一种排序上机所花费的时间。 1.2、选题的意义及背景排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键词有序的序列。此实验通过对各种内部排序算法进行比较,能使我们更好的掌握各种排序的基本思想,掌握各种排序方法的算法实现,掌握各种排序方法的优劣分析及花费的时间的计算,掌握各种排序方法所适应的不同场合。通过该题目的设计,可以加深理解各种数据结构的逻辑结构、存储结构及相应上运算的实现,进一步理解和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际

3、问题,培养我们的动手能力。1.3、设计任务书(1)定义结构体,头文件,定义数组范围,大小。(2)依次描写七种排序的算法。(3)描写产生随机函数的算法。(4)描写菜单函数。(5)描写主函数,调用七种排序的算法。2、设计分析2.1 原始资料用户输入记录的个数30000个,数据由随机函数生成。2.2 输出数据产生的随机数分别用冒泡排序、直插排序、希尔排序、选择排序、快速排序、堆排序、归并排序这些排序方法进行排序,并统计每一种排序上机所花费的时间。 2.3 程序流程图 3程序源代码及其注释#include stdio.h#include stdlib.h#include math.h#include#

4、include#define MAX 60000 /*记录数组的个数*/#define NUM 30000 /*实际输入数组的个数*/typedef int datatype; typedef struct /*定义记录为结构体类型*/ int key; /*记录的关键词域*/ datatype other; /*记录的其它域*/ rectype;rectype *s1,sMAX;/*sMAX存放原始随机数,*s1取出原始数据后进行排序*/*直接插入排序算法如下*/void insert_sort(rectype *r) /*对数组r按递增顺序进行插入排序算法*/ int i,j,n=NUM;

5、 /*NUM为实际输入的记录数,是一个常量*/ for(i=1;i=n;i+) /* iNUM 条件很重要,NUM为实际记录数*/ r0=ri; /*r0为监视哨*/ j=i-1; /*依次插入记录r1,,rNUM*/ while(r0.key0) jump=jump/2; /*取步长d(i+1)=d(i)/2*/ do change=0; /*设置交换标志,change=0表示未交换*/ for(i=1;irm.key) /*记录交换*/ temp=rm.key; rm.key=ri.key; ri.key=temp; change=1; /*change=1表示有交换*/ /*if*/ /

6、*for*/ /*本趟排序完成*/ while(change=1); /*当change=0时终止本趟排序*/ /*while*/ /*当增量jump=1且change=0时终止算法*/*SHELLSORT*/*冒泡排序算法如下*/void bubble_sort(rectype *r) /*从下往上扫描的冒泡排序*/ int i,j,noswap=0,n=NUM; /*noswap为交换标志,NUM为实际输入记录数*/rectype temp;for(i=1;i=i;j-) /*从下往上扫描*/ if(rj.key=temp.key)&(ij) j-; /*从右往左扫描,查找第一个关键词小于

7、temp的记录*/ if(ij) ri+=rj; /*交换ri和rj*/ while(ri.key=temp.key)&(ij) i+; /*从左往右扫描,查找第一个关键词大于temp的记录*/ if(ij) rj-=ri; /*交换ri和rj*/while(i!=j);/*i=j,z则一次划分结束,基准记录达到其最终位置*/ri=temp; /*最后将基准记录temp定位*/return(i);/*PARTITION*/void quick_sort(rectype *r,int hs,int ht)/*对rhs到rht进行快速排序*/ int i;if(hsht) /*只有一个记录或无记录

8、时无需排序*/ i=partition(r,hs,ht); /*对rhs到rht进行一次划分*/ quick_sort(r,hs,i-1); /*递归处理左区间*/ quick_sort(r,i+1,ht); /*递归处理右区间*/*QUICK_SORT*/*直接选择排序算法如下*/void select_sort(rectype *r) rectype temp;int i,j,k,n=NUM; /*NUM为实际输入记录数*/for(i=1;i=n;i+)/*做n-1趟选择排序*/ k=i;for(j=i+1;j=n;j+)/*在当前无序区中选择关键词最小的记录rk*/ if(rj.keyr

9、k.key) k=j; if(k!=i) temp=ri;/*交换记录ri和rk*/ ri=rk; rk=temp; /*for*/*SELECT_SORT*/*堆排序算法如下*/void shift(rectype *r,int i,int m)/*堆的筛选算法,在数组中ri到rm中,调整堆ri*/ int j; rectype temp; temp=ri; j=2*i; while (j=m)/*j=m,r2*i是ri的左孩子*/ if(jm)&(rj.keyrj+1.key) j+; /*j指向ri的左右孩子中关键词较大者*/ if(temp.key0;i-)/*建立初始堆*/ shif

10、t(r,i,n); for(i=n;i1;i-)/*进行n-1趟筛选,交换,调整,完成堆排序*/ temp=r1;/*将堆顶元素r1与最后一个元素交换位置*/ r1=ri; ri=temp; shift(r,1,i-1);/*将数组元素r1到ri-1重新调整成为一个新堆*/ /*FOR*/*HEAP_SORT*/*二路归并排序算法如下*/void merge(rectype *a,rectype *r,int low,int mid,int high) int i,j,k; i=low;j=mid+1;k=low;while(i=mid)&(j=high)/*将两个相邻有序子表进行合并*/ i

11、f(ai.key=aj.key)/*取两表中小者复制*/ rk+=ai+;else rk+=aj+;while(i=mid) rk+=ai+;/*复制第一个有序子表的剩余记录*/while(j=high) rk+=aj+;/*复制第二个有序子表的剩余记录*/*MERGE*/void merge_pass(rectype *r,rectype *r1,int length) int i=1,j,n=NUM;while (i+2*length-1)=n)/*归并若干长度为2*length的两个相邻有序子表*/ merge(r,r1,i,i+length-1,i+2*length-1); i=i+2

12、*length;/*i指向下一对有序子表的起点*/if(i+length-1n) merge(r,r1,i,i+length-1,n);/*处理表长不足2*length的部分*/else for(j=i;j=n;j+) r1j=rj;/*将最后一个子表复制到r1中*/*MERGEPASS*/void merge_sort(rectype *r) int length;rectype r1MAX; length=1;/*归并长度从1开始*/ while(lengthNUM) merge_pass(r,r1,length);/*一趟归并,结果存放在r1中*/ length=2*length;/*归

13、并后有序表的长度加倍*/ merge_pass(r1,r,length);/*再次归并,结果存放在r中*/ length=2*length;/*再次将归并后有序表的长度加倍*/ /*MERGE_SORT*/void creat_randnum(int *a )/*产生给定个数和范围的随机整数函数*/ int i;int range=30000;srand(time(NULL);for(i=1;i=NUM;i+)ai=rand(); /*调用rand生成随机整数*/printf(nnttt排序前的原始随机整数为:nnt);for(i=1;i=NUM;i+) printf(%6d,ai); /*输

14、出随机整数*/ if(i%10=0) printf(nt);printf(n);/*CREAT_RANDNUM*/void create() /*产生NUM个随机整数并保存到记录数组s中*/ int bMAX; int range=30000,i; creat_randnum(b); /*调用随机整数生成函数,结果存放在数组b中*/ for(i=1;i=NUM;i+) si.key=bi;/*将随机整数存放到数组s中*/ s1=s;/*s1指向s,以便保存原始数据*/*CREAT*/void print_record(rectype *r)/*记录数组的输出函数*/ int i;printf(

15、nttt排序后的有序随机整数:nnt);for(i=1;i=NUM;i+)printf(%6d,ri.key); if(i%10=0) printf(nnt);getchar();getchar();/*PRINTRECORD*/int menu_select()/*主菜单选择模块*/ char c; int kk;system(cls);/*清屏函数*/printf(内排序算法的比较-主控模块:nn);printf(ttt1. 直接插入排序n);printf(ttt2. 希尔排序n);printf(ttt3. 冒泡排序n);printf(ttt4. 快速排序n);printf(ttt5. 直

16、接选择排序n);printf(ttt6. 堆排序n);printf(ttt7. 二路归并排序n);printf(ttt0. 退出n);do printf(nttt请按数位07键选择功能:); c=getchar(); kk=c-48;while (kk7);return(kk);/*MENU_SELECT*/main() /*算法比较-主程序模块*/ double time1, time2, time3, time4, time5, time6, time7; clock_t start, finish; int kk; do kk=menu_select(); /*进入主菜单选择模块*/ i

17、f(kk!=0) create(); /*建立记录数组*/ switch(kk) case 1: start=clock(); insert_sort(s1); finish=clock(); time1 = (double)(finish - start)/ CLOCKS_PER_SEC ; printf( 直接插入排序耗时%f secondsn, time1); break; case 2: start=clock(); shell_sort(s1); finish=clock(); time2 = (double)(finish - start)/ CLOCKS_PER_SEC ; pr

18、intf( 希尔排序耗时%f secondsn, time2); break; case 3: start=clock(); bubble_sort(s1); finish=clock(); time3 = (double)(finish - start)/ CLOCKS_PER_SEC ; printf( 冒泡排序耗时%f secondsn, time3); break; case 4: start=clock(); quick_sort(s1,1,NUM); finish=clock(); time4 = (double)(finish - start)/ CLOCKS_PER_SEC ;

19、 printf( 快速排序耗时%f secondsn, time4); break; case 5: start=clock(); select_sort(s1); finish=clock(); time5 = (double)(finish - start)/ CLOCKS_PER_SEC ; printf( 直接选择排序耗时%f secondsn, time5); break; case 6: start=clock(); heap_sort(s1); finish=clock(); time6 = (double)(finish - start)/ CLOCKS_PER_SEC ; p

20、rintf( 堆排序耗时%f secondsn, time6); break; case 7: start=clock(); merge_sort(s1); finish=clock(); time7 = (double)(finish - start)/ CLOCKS_PER_SEC ; printf( 二路归并排序耗时%f secondsn, time7); break; case 0: exit(0); print_record(s1);while (kk!=0);/*MAIN*/4测试结果 (1)选择直接插入排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后

21、也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,直接插入排序耗时0.878000秒(2)选择希尔排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,希尔排序耗时0.026000秒(3)选择冒泡排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,冒泡排序耗时3.456000秒(4)选择快速排序:排序前本有30000个随机

22、数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,快速排序耗时0.005000秒(5)选择直接选择排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,直接选择排序耗时1.528000秒(6)选择堆排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,堆排序耗时0.008000秒

23、(7)选择二路归并排序:排序前本有30000个随机数显示,但数据太多,只截一部分图来表示。排序后也一样,应有30000个排好顺序的整数显示,但由于数据过多,也只截一部分图来表示。由图可知,二路归并排序耗时0.006000秒5.总结与体会总结:由上述比较我们可以清楚地知道,各种排序算法之间的差别是很大的。其中在这几种不同的算法中,快速排序是其中最快的一种排序算法,其它几种算法都有些差异,其中冒泡排序最慢。通过实验设计,我们可以明确感受一些内部排序方法选择的规则,其主要是(1)当n较小时:可采用直接插入排序和直接选择排序;(2)当记录规模小时,可选择直接插入排序;当记录规模大时,可选择直接选择排序

24、,因为直接插入排序所需的记录移动操作比直接选择排序多;(3)当记录基本有序时:可采用直接插入排序和冒泡排序;(4)当n较大时:可采用快速排序和归并排序。体会:通过此次的课程设计,让我从中得到了许多锻炼,也学到了许多东西。通过对排序算法的比较的设计,我更加深入地理解了算法的思想与原理,也深切地感受各种算法的运行时间长短,体会到它的优缺点,并且充分锻炼了我的动手能力,把理论与实践相结合,把学到的知识用于解决实际的问题。而且,通过设计的操作,让我体会到了一个人力量的渺小,充分感受到了团队协作的力量,大家一起相互讨论,积极沟通,相互学习,相互帮助,锻炼了我的协作能力。还有对于编程来说,让我体会到了看书很重要,但实在在动手去做才是硬道理,特别在调试的时候,要有足够的耐心与亲自不断尝试的能力,还有编程一定养成良好的编程习惯,无论命名还是结构。尽管还有很多地方有待提高和改正,不管怎样通过此次的课程设计我受益匪浅,积累了经验,锻炼了自己分析问题、解决问题的能力。6.参考文献1秦锋、袁志祥.数据结构(C语言版)例题详解与课程设计指导.北京:清华大学出版社2XX文库 www. Wenku.baidu,com3. 严蔚敏,吴伟民, 数据结构(C语言版),清华大学出版社,20097.小组人员分工组长:韦志东 组员:夏琪分工: 韦志东:主程序、随机函数生产、报告撰写夏琪:直接插入排序,希尔排序,冒泡排序,

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

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