七种排序算法的比较及每种排序的上机统计时间.docx
《七种排序算法的比较及每种排序的上机统计时间.docx》由会员分享,可在线阅读,更多相关《七种排序算法的比较及每种排序的上机统计时间.docx(34页珍藏版)》请在三一办公上搜索。
1、数据结构课程设计报告课题:排序算法的比较学院:信息学院班级:2011级电子信息工程1班小组成员:韦志东(组长)20111601310027夏琪20111601310028完成时间:2014-01-08教师:周铁目录1.3、设计任务书27271、课程分析11、选题要求利用随机函数产生30000个随机整数,利用直接插入排序、希尔排序,冒泡 排序、直接选择排序、快速排序、堆排序、归并排序的排序方法进行排序,并统 计每一种排序上机所花费的时间。1.2、选题的意义及背景排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任 意序列,重新排列成一个按关键词有序的序列。此实验通过对各种内部排序算
2、法进行比较,能使我们更好的掌握各种排序的 基本思想,掌握各种排序方法的算法实现,掌握各种排序方法的优劣分析及花费 的时间的计算,掌握各种排序方法所适应的不同场合。通过该题目的设计,可以 加深理解各种数据结构的逻辑结构、存储结构及相应上运算的实现,进一步理解 和熟练掌握课本中所学的各种数据结构,学会如何把学到的知识用于解决实际问 题,培养我们的动手能力。1.3、设计任务书(1)定义结构体,头文件,定义数组范围,大小。(2)依次描写七种排序的算法。(3)描写产生随机函数的算法。(4)描写菜单函数。(5)描写主函数,调用七种排序的算法。2、设计分析2.1原始资料用户输入记录的个数30000个,数据由
3、随机函数生成。2.2输出数据产生的随机数分别用冒泡排序、直插排序、希尔排序、选择排序、快速排序、 堆排序、归并排序这些排序方法进行排序,并统计每一种排序上机所花费的时间。3 .程序源代码及其注释#include stdio.h” #include stdlib.h” #include math.h” #include #include#defineMAX 60000 /*记录数组的个数*/#defineNUM 30000 /*实际输入数组的个数*/typedefint datatype;typedefstruct /*定义记录为结构体类型*/ int key;/*记录的关键词域*/dataty
4、pe other; /*记录的其它域*/ rectype;rectype *s1,sMAX;/*sMAX存放原始随机数,*s1取出原始数据后进行排序*/*直接插入排序算法如下*/void insert_sort(rectype *r) /*对数组r按递增顺序进行插入排序算法*/ int i,j,n=NUM;/*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
5、(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*/*for*/ /*本趟排序完成*/while(change=1); /* 当 change=0 时终止本趟排序*/*while*/* 当增量 jump=1 且 change=0 时终止算法 */*SHELLSORT*/*冒泡排序算法如下*/void bubble_sort(rectype *r) /*从下往上扫描的
6、冒泡排序*/ int i,j,noswap=0,n=NUM;/*noswap为交换标志,NUM为实际输入记录数*/rectype temp;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+;/*从左往右扫描,查找第一个关键词大于temp的记录*/if(ij) rj-=ri; /*交换 ri和 rj*/while(i!=j);/*i=j,z则一次划分结束,基准记录达到其最
7、终位置*/ri=temp; /*最后将基准记录tem p定位*/return(i);/*PARTITION*/void quick_sort(rectype *r,int hs,int ht)/*对 rhs到 rht 进行快速排序 */ int i;if(hsht) /*只有一个记录或无记录时无需排序*/ i=partition(r,hs,ht); /*对 rhs到 rht 进行一次划分 */quick_sort(r,hs,i-1); /*递归处理左区间*/quick_sort(r,i+1,ht); /*递归处理右区间*/ /*QUICK_SORT*/*直接选择排序算法如下*/void sel
8、ect_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.keyrk.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中,调整堆 r
9、i*/ 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-)/*建 立初始堆*/shift(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*
10、/*二路归并排序算法如下*/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)/*将两个相邻有序子表进行合并*/ if(ai.key=aj.key)/*取 两表中小者复制*/rk+=ai+;else rk+=aj+;while(i=mid) rk+=ai+;/*复制第一个有序子表的剩余记录*/ while(j=high) rk+=aj+;/*复制第二个有序子表的剩余记录*/ /*MERGE*/void merge_pass(r
11、ectype *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*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;/*将最后一个子表复制到口中*/*MERGEPASS*/void merg
12、e_sort(rectype *r) int length;rectype r1MAX;length=1;/*归并长度从1开始*/while(lengthNUM) merge_pass(r,r1,length);/*一趟归并,结果存放在口中*/length=2*length;/*归并后有序表的长度加倍*/merge_pass(r1,r,length);/*再次归并,结果存放在匕中*/length=2*length;/*再次将归并后有序表的长度加倍*/*MERGE_SORT*/void creat_randnum(int *a )/*产生给定个数和范围的随机整数函数*/ int i;int ra
13、nge=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); /*输出随机整数 */if(i%10=0) printf(nt);printf(n);/*CREAT_RANDNUM*/void create() /*产生NUM个随机整数并保存到记录数组、中*/ int bMAX;int range=30000,i;creat_randnum(b); /*调用随机整数生成函数,结果存放在数组b
14、中*/for(i=1;i=NUM;i+)si.key=bi;/*将随机整数存放到数组、中*/s1=s;/*s1指向s,以便保存原始数据*/*CREAT*/void print_record(rectype *r)/*记录数组的输出函数 */ int i;printf(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;syste
15、m(cls);/*清 屏函数 */printf(内排序算法的比较主控模块:nn);printf(ttt1.直接插入排序n);printf(ttt2.printf(ttt3.printf(ttt4.printf(ttt5.printf(ttt6.printf(ttt7.printf(ttt0.希尔排序n);冒泡排序n);快速排序n);直接选择排序n);堆排序n);二路归并排序n);退出n);do printf(nttt请按数位07键选择功能:);c=getchar(); kk=c-48;while (kk7);return(kk);/*MENU_SELECT*/main() /*算法比较一主程序
16、模块*/double time1, time2, time3, time4, time5, time6, time7;clock_t start, finish;int kk;do kk=menu_select(); /*进入主菜单选择模块*/if(kk!=0) create();/*建立记录数组 */switch(kk) case 1: start=clock();insert_sort(s1);finish=clock();Jbreak;time1 = (double)(finish - start)/ CLOCKS_PER_SECprintf(直接插入排序耗时%三secondsn”, t
17、ime1);case 2: start=clock();shell_sort(s1);finish=clock();time2 =(double)(finish - start)/ CLOCKS_PER_SECprintf(希尔排序耗时%三 secondsn”, time2); break;case 3: start=clock();bubble_sort(s1);finish=clock();time3 = (double)(finish - start)/ CLOCKS_PER_SEC ;printf(冒泡排序耗时%三 secondsn”, time3); break;case 4: st
18、art=clock();quick_sort(s1,1,NUM);finish=clock();time4 = (double)(finish - start)/ CLOCKS_PER_SEC ;printf(快速排序耗时%三 secondsn”, time4); break;case 5: start=clock();select_sort(s1);finish=clock();time5 = (double)(finish - start)/ CLOCKS_PER_SEC ;printf(直接选择排序耗时%三 secondsn”, time5); break;case 6: start=c
19、lock();heap_sort(s1);finish=clock();time6 = (double)(finish - start)/ CLOCKS_PER_SEC ;printf(堆排序耗时 %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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 算法 比较 每种 上机 统计 时间
链接地址:https://www.31ppt.com/p-4929832.html