




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、-实验四:部排序算法的实现与比拟一、 问题描述 1 实验题目:在教科书中,各种部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。试通过随机数据比拟各算法的关键字比拟次数和关键字移动次数,以取得直观感受。2 根本要求:1对常用的部排序算法进展比拟:直接插入排序、简单项选择择排序、冒泡排序、快速排序、希尔排序、归并排序。2利用随机函数产生NN=30000个随机整数,作为输入数据作比拟;比拟的指标为关键字参加的比拟次数和关键字的移动次数关键字交换记为3次移动。3)对结果作出简要分析。3 测试数据:随机函数产生。二、 需求分析 1 程序所能到达的根本可能:通过随机数据产生N个随机
2、数,作为输入数据作比拟;对常用的部排序算法:直接插入排序、简单项选择择排序、冒泡排序、快速排序、希尔排序、归并排序进展比拟:比拟的指标为关键字参加的比拟次数和关键字的移动次数关键字交换记为3次移动。最后结果输出各种排序算法的关键字参加的比拟次数和关键字的移动次数,并按从小到大排列。2 输入的形式及输入值围 :随机函数产生的NN=30000个随机整数。3 输出的形式:输出各种排序算法的关键字参加的比拟次数和关键字的移动次数。并按从小到大排列。4 测试数据要求:随机函数产生的NN=30000个随机整数。三、 概要设计 1. 所用到得数据构造及其ADT 为了实现上述功能,应以一维数组表示集合数据类型
3、。 int sN; int pare6=0,move6=0,DN=0,RSN=0;根本操作: 数组赋值:for(i=1;iN;i+) si=rand()%100; printf(%dt,si); void copys(int S,int RS,int n)/将s的值赋给RS,void SelectSort(int RS,int n) /直接选择排序void BubbleSort(int RS,int n)/冒泡排序void InsertSort(int RS,int n) /直接插入排序int QuickSort(int RS,int low,int high)/快速排序void QuickS
4、ortprint(int RS,int n)/输出快速排序后的结果void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列void Shellsort(int RS,int n)/希尔排序void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列void MSort(int RS,int low,int high)/归并排序2. 主程序流程及其模块调用关系 void SelectSort(int RS,int n) /直接选择排序模块void BubbleSort(int RS,int
5、n)/冒泡排序模块void InsertSort(int RS,int n) /直接插入排序模块int QuickSort(int RS,int low,int high)/快速排序模块void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列void Shellsort(int RS,int n)/希尔排序模块void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列模块调用四、 详细设计 1. 实现每个操作的伪码,重点语句加注释 1void copys(int S,int RS,int
6、 n)/数组复制 int i; for(i=1;in;i+)RSi=Si;2) 直接选择排序void SelectSort(int RS,int n) /直接选择排序int i,j,k;for(i=1;in;i+)k=i;for(j=i+1;j=n;j+)if(RSjRSk)k=j;pare0+; if(k!=i) RS0=RSk; RSk=RSi; RSi=RS0; move0+=3; printf(直接选择排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare0,mov
7、e0);printf(n);3) 冒泡排序void BubbleSort(int RS,int n)/冒泡排序int i,j,flag;for(i=1;i=n;i+)flag=True;for(j=1;j=n-i;j+)if(RSj+1RSj)flag=False;RS0=RSj;RSj=RSj+1;RSj+1=RS0;move1+=3;pare1+;if(flag=True)break;printf(冒泡排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare1,move
8、1);printf(n);4) 直接插入排序void InsertSort(int RS,int n) /直接插入排序int i,j;for(i=2;i=n;i+)RS0=RSi;j=i-1;move2+;while(RS0RSj)pare2+;RSj+1=RSj;move2+;j-;pare2+;RSj+1=RS0;move2+;printf(直接插入排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare2,move2);printf(n);5) 快速排序int Quic
9、kSort(int RS,int low,int high)/快速排序int i,j,n;n=high;i=low;j=high;RS0=RSi;move3+;while(i=RS0&ji)j-;pare3+;pare3+;if(ji)RSi=RSj;move3+;i+;while(RSii)i+;pare3+;pare3+; if(ji)RSj=RSi;move3+;j-;RSi=RS0;move3+;if(lowi)QuickSort(RS,low,i-1);if(ihigh)QuickSort(RS,j+1,high);6) 输出快速排序后的结果void QuickSortprint(i
10、nt RS,int n)/输出快速排序后的结果 int i;QuickSort(RS,1,n);printf(快速排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare3,move3);printf(n);7) 一趟希尔排序,按间隔m划分子序列void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列int i,j,temp;for(i=m;i=m&temp=1)/循环直到m为0Shellsert(RS,m,n);m=(m=21:
11、(m/2);/缩小增进量printf(希尔排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare4,move4);printf(n);9) 将两个有序序列归并为一个有序序列void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列int i,j,k;int n1,n2;i=low;j=mid+1;k=low;while(i=mid&j=high)/两两比拟if(RSi=RSj)Dk=RSi;i+;k+;else
12、 Dk=RSj; j+; k+;pare5+;move5+;if(i=mid)for(n1=k,n2=i;n1=high&n2=mid;n1+,n2+)Dn1=RSn2;move5+;elsefor(n1=k,n2=j;n1=high&n2=high;n1+,n2+)Dn1=RSn2;move5+; for(mid=low;mid=high;mid+)RSmid=Dmid;move5+;10) 归并排序void MSort(int RS,int low,int high)/归并排序int mid;if(lowhigh)mid=(low+high)/2; MSort(RS,low, mid);
13、MSort(RS, mid+1,high);Merge(RS,low,mid,high);11) 主函数void main() int i,j,sN; time_t rawtime;struct tm * timeinfo; time (&rawtime);timeinfo = localtime (&rawtime); printf( 实验名称:实验四:部排序算法的实现与比拟n);printf( *:031350102n); printf( :王亚文n); printf(=n);printf(程序运行开场,);printf(Current local time and date:%s,asc
14、time(timeinfo);printf(产生的随机数为:n); for(i=1;iN;i+) si=rand()%100; printf(%dt,si); printf(n); do copys(s,RS,N);printf(请选择所需排序方法:); printf(n); printf(1.选择法 ,2.冒泡法 ,3.插入法 ,4.快速法 , 5.希尔排序法 ,6.归并排序法,7.输出比拟信息,8.退出n); scanf( %d,&j); switch(j) case 1: SelectSort(RS,N-1);break; case 2: BubbleSort(RS,N-1);break
15、; case 3: InsertSort(RS,N-1); break; case 4: QuickSortprint(RS,N-1);break; case 5: Shellsort(RS,N-1);break; case 6:MSort(RS,1,N-1);printf(归并排序后的结果:); for(i=1;iN;i+)printf(%dt,Di);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare5,move5);printf(n);break;case 7:SelectSort(pare,5);SelectSort(move,5);pri
16、ntf(关键字参加的比拟次数:n);for(i=1;i=5;i+)printf(%dt,parei);printf(n);printf(关键字的移动次数:n);for(i=1;i=5;i+)printf(%dt,movei);printf(n);break;case 8: printf(Current local time and date:%s,asctime(timeinfo);e*it(0);break; while(1); 五、 调试分析 1. 设计与调试过程中遇到的问题分析、体会 调试过程:由于本次程序设计的数据和模块比拟多,所以采用分块调试的方法,在编写完一个部排序算法后,为了验证
17、是否排序成功以及所输出的关键字比拟次数和移动次数是否正确,采用先定义一个需要排序9个数字的数组,S10=0,1,2,3,4,5,6,7,8,9和S10=0,9,8,7,6,5,4,3,2,1,用这两个数组检验程序的正确性与否。调试步骤,程序及相关结果如下:1) 直接选择排序:*include *include *include void SelectSort(int RS,int n) /直接选择排序int i,j,k,move=0,pare=0;for(i=1;in;i+)k=i;for(j=i+1;j=n;j+)if(RSjRSk)k=j;pare+; if(k!=i) RS0=RSk;
18、RSk=RSi; RSi=RS0; move+=3; printf(直接选择排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare,move);printf(n);void main()int s10=0,1,2,3,4,5,6,7,8,9; SelectSort(s,9);s10=0,1,2,3,4,5,6,7,8,9;S10=0,9,8,7,6,5,4,3,2,12)冒泡排序*include *include *include *define False 0*defin
19、e True 1void BubbleSort(int RS,int n)/冒泡排序int i,j,flag,move=0,pare=0;for(i=1;i=n;i+)flag=True;for(j=1;j=n-i;j+)if(RSj+1RSj)flag=False;RS0=RSj;RSj=RSj+1;RSj+1=RS0;move+=3;pare+;if(flag=True)break;printf(冒泡排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare,move);
20、printf(n);void main()int s10=0,1,2,3,4,5,6,7,8,9; BubbleSort(s,9);s10=0,1,2,3,4,5,6,7,8,9s10=0,9,8,7,6,5,4,3,2,1;3) 直接插入排序*include *include *include *define False 0*define True 1void InsertSort(int RS,int n) /直接插入排序int i,j,pare=0,move=0;for(i=2;i=n;i+)RS0=RSi;j=i-1;move+;while(RS0RSj)pare+;RSj+1=RSj
21、;move+;j-;pare+;RSj+1=RS0;move+;printf(直接插入排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare,move);printf(n);void main()int s10=0,9,8,7,6,5,4,3,2,1; InsertSort(s,9); s10=0,9,8,7,6,5,4,3,2,1;s10=0,1,2,3,4,5,6,7,8,9;4) 快速排序*include *include *include *define False
22、 0*define True 1int pare6=0,move6=0;int QuickSort(int RS,int low,int high)/快速排序int i,j,n;n=high;i=low;j=high;RS0=RSi;move3+;while(i=RS0&ji)j-;pare3+;pare3+;if(ji)RSi=RSj;move3+;i+;while(RSii)i+;pare3+;pare3+; if(ji)RSj=RSi;move3+;j-;RSi=RS0;move3+;if(lowi)QuickSort(RS,low,i-1);if(ihigh)QuickSort(RS,
23、j+1,high);void QuickSortprint(int RS,int n)/输出快速排序后的结果 int i;QuickSort(RS,1,n);printf(快速排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare3,move3);printf(n);void main()int s10=0,9,8,7,6,5,4,3,2,1; QuickSortprint(s,9);s10=0,9,8,7,6,5,4,3,2,1;5) 希尔排序*include *incl
24、ude *include *define False 0*define True 1int pare6=0,move6=0;void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列int i,j,temp;for(i=m;i=m&temp=1)/循环直到m为0Shellsert(RS,m,n);m=(m=21:(m/2);/缩小增进量printf(希尔排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare4,move4);pr
25、intf(n);void main()int s10=0,9,8,7,6,5,4,3,2,1; Shellsort(s,9);s10=0,9,8,7,6,5,4,3,2,1;s10=0,1,2,3,4,5,6,7,8,9;6) 归并排序*include *include *include *define False 0*define True 1int pare6=0,move6=0,D10=0;void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列int i,j,k;int n1,n2;i=low;j=mid+1;k=low;
26、while(i=mid&j=high)/两两比拟if(RSi=RSj)Dk=RSi;i+;k+;else Dk=RSj; j+; k+;pare5+;move5+;if(i=mid)for(n1=k,n2=i;n1=high&n2=mid;n1+,n2+)Dn1=RSn2;move5+;elsefor(n1=k,n2=j;n1=high&n2=high;n1+,n2+)Dn1=RSn2;move5+; for(mid=low;mid=high;mid+)RSmid=Dmid;move5+;void MSort(int RS,int low,int high)/归并排序int mid;if(lo
27、whigh)mid=(low+high)/2; MSort(RS,low, mid); MSort(RS, mid+1,high);Merge(RS,low,mid,high);void main()int s10=0,9,8,7,6,5,4,3,2,1,i; MSort(s,1,9);printf(归并排序后的结果:); for(i=1;i10;i+)printf(%dt,Di);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare5,move5);printf(n);s10=0,9,8,7,6,5,4,3,2,1;调试过程中遇到的问题:1这个部排
28、序算法的实现与比拟程序设计中,大局部排序算法在书上已经给了详细的程序只需要稍加更改,所以在编写排序程序时并没有太大的问题,唯一的问题是for(mid=low;mid=high;mid+)RSmid=Dmid;move5+;这段程序一开场书上是放在MSort这个程序中,但是我放在这个程序里输出的排序并不是按照升序排列的,将这段程序改在merge里,程序就能正常输出了,还有一个问题是随机数产生的数字是放在数组里的,执行完第一个排序后再想去执行下一个排序程序时再用原来的数组就已经不是利用随机函数产生的数组了而是经过排序后形成的有序数组,这就影响了下一个程序的正常运行,他所输出的关键字的比拟次数和移动
29、次数就不是我们所想的随机函数产生的数组排序时的比拟次数和移动次数,为了解决这个问题考虑另外定义一个数组,先利用随机函数产生一个随机数组,每次执行排序前都将随机数组中的数值赋给另一个数组,对另外的数组执行排序程序,这就可以有效解决输出的关键字的比拟次数和移动次数不对的问题。这样第一步显示保证每个程序都可以将一个无序的序列排序成为有序序列。2在完成了第一步之后就可以进展第二部,进展关键字的比拟次数和移动次数的计算,一开场我是将每一个程序中都定义一个pare和move值,这种方法在前几个程序中并没有什么问题,也没有什么不方便,但在之后一个函数需要调用另一个函数时,因为一个函数只能返回一个值,这个对于
30、这个需要返回两个值的程序就不适用了,所以就考虑定义了两个数组,int pare6=0,move6=0,这样就解决了这个不能再一个程序中返回两个值得问题,同时也大大简化了后面需要对各种部排序算法所产生的关键字的比拟次数和移动次数的排序与输出,一举两得。这个程序是通过随机数据产生N个随机数,作为输入数据作比拟;对常用的部排序算法:直接插入排序、简单项选择择排序、冒泡排序、快速排序、希尔排序、归并排序进展比拟:比拟的指标为关键字参加的比拟次数和关键字的移动次数关键字交换记为3次移动。最后结果输出各种排序算法的关键字参加的比拟次数和关键字的移动次数,并按从小到大排列。6、 测试结果 7、 附录 *in
31、clude *include *include *include *define N 100*define False 0*define True 1int pare6=0,move6=0,DN=0,RSN=0;void copys(int S,int RS,int n) int i; for(i=1;in;i+)RSi=Si;void SelectSort(int RS,int n) /直接选择排序int i,j,k;for(i=1;in;i+)k=i;for(j=i+1;j=n;j+)if(RSjRSk)k=j;pare0+; if(k!=i) RS0=RSk; RSk=RSi; RSi=
32、RS0; move0+=3; printf(直接选择排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare0,move0);printf(n);void BubbleSort(int RS,int n)/冒泡排序int i,j,flag;for(i=1;i=n;i+)flag=True;for(j=1;j=n-i;j+)if(RSj+1RSj)flag=False;RS0=RSj;RSj=RSj+1;RSj+1=RS0;move1+=3;pare1+;if(flag=Tru
33、e)break;printf(冒泡排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare1,move1);printf(n);void InsertSort(int RS,int n) /直接插入排序int i,j;for(i=2;i=n;i+)RS0=RSi;j=i-1;move2+;while(RS0RSj)pare2+;RSj+1=RSj;move2+;j-;pare2+;RSj+1=RS0;move2+;printf(直接插入排序后的结果:);for(i=1;i=
34、n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare2,move2);printf(n);int QuickSort(int RS,int low,int high)/快速排序int i,j,n;n=high;i=low;j=high;RS0=RSi;move3+;while(i=RS0&ji)j-;pare3+;pare3+;if(ji)RSi=RSj;move3+;i+;while(RSii)i+;pare3+;pare3+; if(ji)RSj=RSi;move3+;j-;RSi=RS0;move3+;
35、if(lowi)QuickSort(RS,low,i-1);if(ihigh)QuickSort(RS,j+1,high);void QuickSortprint(int RS,int n)/输出快速排序后的结果 int i;QuickSort(RS,1,n);printf(快速排序后的结果:);for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare3,move3);printf(n);void Shellsert(int RS,int m,int n)/一趟希尔排序,按间隔m划分子序列in
36、t i,j,temp;for(i=m;i=m&temp=1)/循环直到m为0Shellsert(RS,m,n);m=(m=21:(m/2);/缩小增进量printf(希尔排序后的结果:); for(i=1;i=n;i+)printf(%dt,RSi);printf(n);printf(关键字参加的比拟次数:%d,关键字的移动次数:%dn,pare4,move4);printf(n);void Merge(int RS,int low,int mid,int high)/将两个有序序列归并为一个有序序列int i,j,k;int n1,n2;i=low;j=mid+1;k=low;while(i=mid&j=high)/两两比拟if(RSi=RSj)Dk=RSi;i+;k+;else Dk=RSj; j+; k+;pare5+;move5+;if(i=mid)for(n1=k,n2=i;n1=high&n2=mid;n1+,n2+)Dn1=RSn2;move5+;elsefor(n1=k,n2=j;n1=high&n2=high;n1+,n2+)Dn1=RSn2;move5+; for(mid=low;mid=high;mid+)RSmid=Dmid;mov
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年项目管理专业人士资格认证内容试题及答案
- 2025年燃气安全生产管理人员模拟考试题及答案
- 植物园绿色建筑设计与节能环保考核试卷
- 2024年项目管理考试真题解析试题及答案
- 园艺师多功能果园管理试题及答案
- 2023年中国联通博尔塔拉蒙古自治州分公司招聘笔试参考题库附带答案详解
- 2023年中国石化高校毕业生专项招聘笔试参考题库附带答案详解
- 烟草机械设备的远程监控与故障分析考核试卷
- 地铁检修库维修施工方案
- 纸板容器市场前景预测考核试卷
- 2024年韶关市始兴县事业单位招聘工作人员笔试真题
- 安徽省皖南八校2024-2025学年高一下学期4月期中考试数学试题
- 国家发展改革委低空经济司
- 单位体检协议书模板合同
- 委托律师签署协议书
- 图文工厂转让协议书
- 货物贸易的居间合同
- 2025-2030中国疗养院行业市场深度分析及前景趋势与投资研究报告
- 2025年国企山东济南公共交通集团有限公司招聘笔试参考题库附带答案详解
- (三模)吉林市2025届高三第三次模拟测试 历史试卷(含答案详解)
- 科室医疗质量管理小组职责
评论
0/150
提交评论