1、时间管理七种排序算法的比较及每种排序的上机统计时间(时间管理)七种排序算法的比较及每种排序的上机统计时间数据结构课程设计方案课题:排序算法的比较学院:信息学院班级: 2011 级电子信息工程 1 班小组成员:韦志东(组长) 227 夏琪 228完成时间: 2014-01-08 教师:周铁1、课程分析 21.1、选题 21.2、选题的意义及背景 21.3、设计任务书 22、设计分析 22.1、原始数据 22.2、输ft数据 22.3、程序流程图 33、程序源代码及注释 34、测试结果 125、总结 266、参考文献 277、小组人员分工 271、课程分析1.1、选题要求利用随机函数产生 3000
2、0 个随机整数,利用直接插入排序、希尔排序,冒泡排序、直接选择排序、快速排序、堆排序、归且排序的排序方法进行排序,且统计每壹种排序上机所花费的时间。1.2、选题的意义及背景排序是计算机程序设计中的壹种重要操作,它的效用是将壹个数据元素的任意序列,重新排列成壹个按关键词有序的序列。此实验通过对各种内部排序算法进行比较,能使我们更好的掌握各种排序的基本思想,掌握各种排序方法的算法实现,掌握各种排序方法的优劣分析及花费的时间的计算,掌握各种排序方法所适应的不同场合。通过该题目的设计,能够加深理解各种数据结构的逻辑结构、存储结构及相应上运算的实现,进壹步理解和熟练掌握课本中所学的各种数据结构,学会如何
3、把学到的知识用于解决实际问题,培养我们的动手能力。1.3、设计任务书(1)定义结构体,头文件,定义数组范围,大小。(2)依次描写七种排序的算法。(3)描写产生随机函数的算法。(4)描写菜单函数。(5)描写主函数,调用七种排序的算法。2、设计分析2.1原始资料用户输入记录的个数30000个,数据由随机函数生成。2.2输ft数据产生的随机数分别用冒泡排序、直插排序、希尔排序、选择排序、快速排序、堆排序、归且排序这些排序方法进行排序,且统计每壹种排序上机所花费的时间。2.3程序流程图2.43程序源代码及其注释#includestdio.h#includestdlib.h#includemath.h#
4、include#include#defineMAX60000/*记录数组的个数*/#defineNUM30000/*实际输入数组的个数*/ typedefintdatatype;typedefstruct/*定义记录为结构体类型*/intkey;/*记录的关键词域*/datatypeother;/*记录的其它域*/rectype;rectype*s1,sMAX;/*sMAX存放原始随机数,*s1取ft原始数据后进行排序*/*直接插入排序算法如下*/voidinsert_sort(rectype*r)/*对数组r按递增顺序进行插入排序算法*/inti,j,n=NUM;/*NUM为实际输入的记录数
5、,是壹个常量*/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*/dochange=0;/*设置交换标志,change=0表示未交换*/ for(i=1;irm.key)/*记录交换*/temp=rm.key;rm.key=ri.key; ri.key=temp;change=1;/*change=1表示有交换*/*if*/*for*/*本趟排序完成*/while(change=1);/*当chang
6、e=0时终止本趟排序*/*while*/*当增量jump=1且change=0时终止算法*/*SHELLSORT*/*冒泡排序算法如下*/voidbubble_sort(rectype*r)/*从下往上扫描的冒泡排序*/inti,j,nos*noswap为交换标志,NUM为实际输入记录数*/ rectypetemp;for(i=1;i=i;j-)/*从下往上扫描*/if(rj.key=temp.key)&(ij)j-;/*从右往左扫描,查找第壹个关键词小于temp的记录*/if(ij)ri+=rj;/*交换ri和rj*/ while(ri.key=temp.key)&(ij)i+;/*从左往右
7、扫描,查找第壹个关键词大于temp的记录*/ if(ij)rj-=ri;/*交换ri和rj*/while(i!=j);/*i=j,z则壹次划分结束,基准记录达到其最终位置*/ri=temp;/*最后将基准记录temp定位*/ return(i);/*PARTITION*/voidquick_sort(rectype*r,inths,intht)/*对rhs到rht进行快速排序*/inti;if(hsht)/*只有壹个记录或无记录时无需排序*/i=partition(r,hs,ht);/*对rhs到rht进行壹次划分*/ quick_sort(r,hs,i-1);/*递归处理左区间*/quick
8、_sort(r,i+1,ht);/*递归处理右区间*/*QUICK_SORT*/*直接选择排序算法如下*/ voidselect_sort(rectype*r)rectypetemp;inti,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.keyrk.key)k=j;if(k!=i)temp=ri;/*交换记录ri和rk*/ ri=rk;rk=temp;/*for*/*SELECT_SORT*/*堆排序算法如下*/voidshift(
9、rectype*r,inti,intm)/*堆的筛选算法,于数组中ri到rm中,调整堆ri*/intj;rectypetemp; 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-)/*建立初始堆*/ shift(r,i,n);for(i=n;i1;i-)/*进行n-1趟筛选,交换,调整,完成堆排序*/temp=r1;/*将堆顶元素r1和最后壹个元素交换位置*/ r1=ri;ri=temp;shift(r,1,i-1);/*将数组元素r
10、1到ri-1重新调整成为壹个新堆*/*FOR*/*HEAP_SORT*/* 二 路 归 且 排 序 算 法 如 下 */ voidmerge(rectype*a,rectype*r,intlow,intmid,inthigh)inti,j,k; i=low;j=mid+1;k=low;while(i=mid)&(j=high)/*将俩个相邻有序子表进行合且*/if(ai.key=aj.key)/*取俩表中小者复制*/ rk+=ai+;elserk+=aj+;while(i=mid)rk+=ai+;/*复制第壹个有序子表的剩余记录*/while(j=high)rk+=aj+;/*复制第二个有序子
11、表的剩余记录*/*MERGE*/ voidmerge_pass(rectype*r,rectype*r1,intlength)inti=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*length;/*i指向下壹对有序子表的起点*/if(i+length-1n)merge(r,r1,i,i+length-1,n);/*处理表长不足2*length的部分*/ elsefor(j=i;j=n;j+)r1j=rj;/*将最后壹个子表复制到r1
12、中*/*MERGEPASS*/voidmerge_sort(rectype*r)intlength; rectyper1MAX;length=1;/*归且长度从1开始*/ while(lengthNUM)merge_pass(r,r1,length);/*壹趟归且,结果存放于r1中*/length=2*length;/*归且后有序表的长度加倍*/merge_pass(r1,r,length);/*再次归且,结果存放于r中*/length=2*length;/*再次将归且后有序表的长度加倍*/*MERGE_SORT*/voidcreat_randnum(int*a)/*产生给定个数和范围的随机整
13、数函数*/inti; intrange=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);/*输ft随机整数*/ if(i%10=0)printf(nt);printf(n);/*CREAT_RANDNUM*/voidcreate()/*产生NUM个随机整数且保存到记录数组s中*/intbMAX; intrange=30000,i;creat_randnum(b);/*调用随机整数生成函
14、数,结果存放于数组b中*/ for(i=1;i=NUM;i+)si.key=bi;/*将随机整数存放到数组s中*/s1=s;/*s1指向s,以便保存原始数据*/*CREAT*/voidprint_record(rectype*r)/*记录数组的输ft函数*/inti;printf(nttt排序后的有序随机整数:nnt); for(i=1;i=NUM;i+)printf(%6d,ri.key); if(i%10=0)printf(nnt);getchar();getchar();/*PRINTRECORD*/intmenu_select()/*主菜单选择模块*/charc;intkk;syste
15、m(cls);/*清屏函数*/printf(内排序算法的比较-主控模块:nn);printf(ttt1.直接插入排序n);printf(ttt2.希尔排序n);printf(ttt3.冒泡排序n);printf(ttt4.快速排序n);printf(ttt5.直接选择排序n);printf(ttt6.堆排序n);printf(ttt7.二路归且排序n);printf(ttt0.退ftn);doprintf(nttt请按数位07键选择效用:); c=getchar();kk=c-48;while(kk7); return(kk);/*MENU_SELECT*/main()/*算法比较-主程序模块
16、*/doubletime1,time2,time3,time4,time5,time6,time7; clock_tstart,finish;intkk;dokk=menu_select();/*进入主菜单选择模块*/if(kk!=0)create();/*建立记录数组*/ switch(kk)case1:start=clock(); insert_sort(s1); finish=clock();time1=(double)(finish-start)/CLOCKS_PER_SEC;printf(直接插入排序耗时%fsecondsn,time1);break; case2:start=clo
17、ck();shell_sort(s1); finish=clock();time2=(double)(finish-start)/CLOCKS_PER_SEC;printf(希尔排序耗时%fsecondsn,time2);break; case3:start=clock();bubble_sort(s1); finish=clock();time3=(double)(finish-start)/CLOCKS_PER_SEC;printf(冒泡排序耗时%fsecondsn,time3);break; case4:start=clock();quick_sort(s1,1,NUM); finish
18、=clock();time4=(double)(finish-start)/CLOCKS_PER_SEC;printf(快速排序耗时%fsecondsn,time4);break; case5:start=clock();select_sort(s1); finish=clock();time5=(double)(finish-start)/CLOCKS_PER_SEC;printf(直接选择排序耗时%fsecondsn,time5);break; case6:start=clock();heap_sort(s1); finish=clock();time6=(double)(finish-s
19、tart)/CLOCKS_PER_SEC;printf(堆排序耗时%fsecondsn,time6);break; case7:start=clock();merge_sort(s1); finish=clock();time7=(double)(finish-start)/CLOCKS_PER_SEC;printf(二路归且排序耗时%fsecondsn,time7);break; case0:exit(0);print_record(s1);while(kk!=0);/*MAIN*/4测试结果(1)选择直接插入排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹
20、样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,直接插入排序耗时0.878000秒(2)选择希尔排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,希尔排序耗时0.026000秒(3)选择冒泡排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,冒泡排序耗时3.456000秒(4)选择快速排序:排序前本有30000个随
21、机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,快速排序耗时0.005000秒(5)选择直接选择排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,直接选择排序耗时1.528000秒(6)选择堆排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,堆排序耗时0.008
22、000秒(7)选择二路归且排序:排序前本有30000个随机数显示,但数据太多,只截壹部分图来表示。排序后也壹样,应有30000个排好顺序的整数显示,但由于数据过多,也只截壹 部分图来表示。由图可知,二路归且排序耗时0.006000秒5.总结和体会总结:由上述比较我们能够清楚地知道,各种排序算法之间的差别是很大的。其中于这几种不同的算法中,快速排序是其中最快的壹种排序算法,其它几种算法均有些差异,其中冒泡排序最慢。通过实验设计,我们能够明确感受壹些内部排序方法选择的规则,其主要是(1) 当 n 较小时:可采用直接插入排序和直接选择排序;(2)当记录规模小时,可选择直接插入排序;当记录规模大时,可
23、选择直接选择排序,因为直接插入排序所需的记录移动操作比直接选择排序多;(3)当记录基本有序时:可采用直接插入排序和冒泡排序;(4)当 n 较大时:可采用快速排序和归且排序。体会:通过此次的课程设计,让我从中得到了许多锻炼,也学到了许多东西。通过对排序算法的比较的设计,我更加深入地理解了算法的思想和原理,也深切地感受各种算法的运行时间长短,体会到它的优缺点,且且充分锻炼了我的动手能力,把理论和实践相结合,把学到的知识用于解决实际的问题。而且,通过设计的操作,让我体会到了壹个人力量的渺小,充分感受到了团队协作的力量,大家壹起相互讨论,积极交流,相互学习,相互帮助,锻炼了我的协作能力。仍有对于编程来
24、说,让我体会到了见书很重要,但实于于动手去做才是硬道理,特别于调试的时候,要有足够的耐心和亲自不断尝试的能力,仍有编程壹定养成良好的编程习惯,无论命名仍是结构。尽管仍有很多地方有待提高和改正,不管怎样通过此次的课程设计我受益匪浅,积累了经验,锻炼了自己分析问题、解决问题的能力。6.参考文献1秦锋、袁志祥.数据结构(C 语言版)例题详解和课程设计指导.北京:清华大学ft版社2XX文库 3.严蔚敏,吴伟民,数据结构(C 语言版),清华大学ft版社,20097.小组人员分工 组长:韦志东组员:夏琪分工:韦志东:主程序、随机函数生产、方案撰写夏琪:直接插入排序,希尔排序,冒泡排序,直接选择,快速排序,堆排序,归且排序,数据记录。知识改变命运
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1