课程设计——内部排序算法比较

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

内部排序算法比较1需求分析各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间,存在一定的却缺陷。我们将通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。所设计的程序应能够将产生的随机数据同时用不同的内部排序算法排序,并列出关键字比较次数与移动次数,方便比较。待排序表的表长不少于100,为方便起见,我们令表长等于100,用5组随机的数据排序的结果作比较。.概要设计2.1可能排序表的抽象数据类型定义:ADTOrderableList{数据对象:D={|∈IntegerSet,i=1,2,……,n,n≥0}数据关系:R1={,|,∈D,i=2,……n}基本操作:InitList(n)操作结果:构造一个长度为n,元素值依次为1,2,……,n的有序表。RandomizeList(d,isInverseOrder)操作结果:首先根据isInverseOrder为True或False,将表置为逆序或正序,然后将表进行d(0≤d≤8)级随机打乱。d为0时表不打乱,d越大,打乱程度越高。RecallList()操作结果:恢复最后一次用RandomizeList随机大乱的可排序表。ListLength()操作结果:返回可排序的长度。内部排序算法比较2ListEmpty()操作结果:若可排序表为空表,则返回True,否则返回False。BubbleSort(&c,&s)操作结果:进行冒泡排序,返回关键字比较次数c和移动次数s。InsertSort(&c,&s)操作结果:进行插入排序,返回关键字比较次数c和移动次数s。SelectSort(&c,&s)操作结果:进行选择排序,返回关键字比较次数c和移动次数s。QuickSort(&c,&s)操作结果:进行快速排序,返回关键字比较次数c和移动次数s。ShellSort(&c,&s)操作结果:进行希尔排序,返回关键字比较次数c和移动次数s。HeapSort(&c,&s)操作结果:进行堆排序,返回关键字比较次数c和移动次数s。ListTraveres(visit())操作结果:依次对L中的每个元素调用函数visit()。}ADTOrderableList2.2本程序包含两个模块:2.2.1主程序模块:voidmain(){初始化;do{接受命令;处理命令;}while(命令!=退出);}内部排序算法比较32.2.2可排序表单元模块:——实现可排序表的抽象数据类型;主程序模块↓↓可排序表单元模块详细设计3.1直接插入排序直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已牌号序的有序表中,从而得到一个新的、记录数增1的有序表。其算法如下:voidinsertsort(sqlistb,intn){inti,j;ints=0,t=0;for(i=2;in;i++){b[0]=b[i];s++;j=i-1;t++;while(b[0].keyb[j].key){b[j+1]=b[j];j--;s++;t++;}内部排序算法比较4b[j+1]=b[0];s++;}cout移动次数=s,比较次数=tendl;}3.2折半排序由于插入排序的基本操作是在一个有序表中进行查找和插入,可知这个“查找”操作可利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序,其算法如下:voidBInsertSort(int*data,long*p_movetime,long*p_comparetime){inti,j,amount,low,high,m;*p_movetime=*p_comparetime=0;amount=*data;for(i=2;i=amount;++i){*(data)=*(data+i);(*p_movetime)++;low=1;high=i-1;while(low=high){(*p_comparetime)++;m=(low+high)/2;(*p_comparetime)++;//针对于接下来的*(data)和*(data+m)的比较if(*(data)*(data+m))high=m-1;elselow=m+1;内部排序算法比较5}for(j=i-1;j=high+1;--j){*(data+j+1)=*(data+j);(*p_movetime)++;}*(data+high+1)=*(data);(*p_movetime)++;}}3.3二路插入排序二路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。算法如下:voidTwoWaySort(int*data,long*p_movetime,long*p_comparetime){intamount;intfirst,final,i,j;//first和final分别指示有序序列中的第一个记录和最后一个记录在d中的位置;intd[33000];*p_movetime=*p_comparetime=0;amount=*data;d[1]=*(data+1);first=1;final=1;for(i=2;i=amount;i++){内部排序算法比较6(*p_comparetime)++;if(*(data+i)=d[1])//插入前部{for(j=final;d[j]*(data+i);j--){(*p_comparetime)++;d[j+1]=d[j];(*p_movetime)++;}d[j+1]=*(data+i);(*p_movetime)++;final++;}else//插入后部{if(first==1){first=amount;d[first]=*(data+i);(*p_movetime)++;}else{for(j=first;d[j]*(data+i)&&j=amount;j++){(*p_comparetime)++;d[j-1]=d[j];(*p_movetime)++;}d[j-1]=*(data+i);(*p_movetime)++;first--;}内部排序算法比较7}}//forfor(i=first,j=1;j=amount;i=i%(amount)+1,j++)//将序列复制回去*(data+j)=d[i];}3.4希尔排序希尔排序又称“缩小增量排序”,它也是一种属插入排序类的方法,但在时间效率上较前述集中排序方法有较大的改进。它的基本思想是:先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。算法如下:voidshellsort(sqlistb,intn){inti,j,gap;recx;ints=0,t=0;gap=n/2;while(gap0){for(i=gap+1;in;i++){j=i-gap;while(j0){t++;if(b[j].keyb[j+gap].key)内部排序算法比较8{x=b[j];b[j]=b[j+gap];b[j+gap]=x;j=j-gap;s+=3;}elsej=0;gap=gap/2;}}cout移动次数=s,比较次数=tendl;}}3.5起泡排序:冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。算法如下:voidgensort(intb[],intn){inti,j;ints=0,t=0;for(i=0;in-1;i++){for(j=i+1;jn;j++){t++;if(b[i]b[j]){inttemp=b[i];b[i]=b[j];内部排序算法比较9b[j]=temp;s+=3;}}}cout移动次数=s,比较次数=tendl;}4、调试分析4.1调试问题分析编程过程中出现了各种各样的错误,如输错代码,未定义变量,数组下标越界,产生随机数据的程序不工作等等,导致编译没能通过没有结果.最后和组员讨论,又请教一些同学,终于把所有问题都解决掉,运行出了结果.4.2经验体会通过完成本次课程设计,我学到了很多.编程过程中出现了很多的问题,对程序进行了很多次的调试,自己调试程序的能力有了很大的提升.同时也意识到一个人的力量实在有限,应该多和同学交流合作,这样既能加深了同学之间的友谊也能提高效率,实在没有必要耗费大量的时间去钻牛角尖.5、用户使用说明内部排序算法比较用户使用说明本系统采用VisualC++语言编写,运用软件工程的思想,采用面向对象分析、设计的方法学完成。本程序主要用于人们比较排序算法,从直观感受各种排序的优缺点。6、测试数据与测试结果内部排序算法比较10下图是自动产生的五组随机产生的100个数据的排序结果,由图可知希尔排序、快速排序的关键字移动次数和比较次数都相对较少。起泡排序、选择排序中关键字比较次数很大,起泡排序、插入排序移动次数很大。这样方便我们快捷的看出排序优缺点。内部排序算法比较11内部排序算法比较12内部排序算法比较13参考文献[1]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:清华大学出版社,1997.04[2]严蔚敏,吴伟民.数据结构题集(C语言版)[M].北京:清华大学出版社,1997.04[3]汪杰等,数据结构经典算法实现与习题解答[M].北京:人民邮电出版社,2004[4]陈媛,何波,涂晓红等,算法与数据结构[M].北京:清华大学出版社,2005[5]李春葆.数据结构习题与解析(第二版)[M].北京:清华大学出版社,2004.07内部排序算法比较14附录源程序清单#includeiostream.h#includeiomanip.h#includestdlib.h#includestdio.h#includetime.h#defineN100intp,q;//起泡排序voidgensort(intb[],intn){inti,j;ints=0,t=0;for(i=0;in-1;i++){for(j=i+1;jn;j++){t++;if(b[i]b[j]){inttemp=b[i];b[i]=b[j];b[j]=temp;s+=3;}}}cout移动次数=s,比较次数=tendl;}//插入排序typedefintKeyType;structrec{KeyTypekey;};typedefrecsqlist[N];voidinsertsort(sqlistb,intn){inti,j;ints=0,t=0;for(i=2;in;i++)内部排序算法比较15{b[0]=b[i];s++;j=i-1;t++;while(b[0].keyb[j].key){b[j+1]=b[j];j--;s++;t++;}b[j+1]=b[0];s++;}cout移动次数=s,比较次数=tendl;}//希尔排序voidshellsort(sqlistb,intn){inti,j,gap;recx;ints=0,t=0;gap=n/2;while(gap0){for(i=gap+1;in;i++){j=i-gap;while(j0){t++;if(b[j].keyb[j+gap].key){x=b[j];b[j]=b[j

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功