北邮数据结构实验报告排序.docx
- 文档编号:6659889
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:18
- 大小:143.37KB
北邮数据结构实验报告排序.docx
《北邮数据结构实验报告排序.docx》由会员分享,可在线阅读,更多相关《北邮数据结构实验报告排序.docx(18页珍藏版)》请在冰豆网上搜索。
北邮数据结构实验报告排序
北京邮电大学
数据结构试验报告
实验名称:
实验四排序
学生姓名:
班级:
班内序号:
学号:
日期:
2014年1月4日
1实验目的
学习、实现、对比各种排序算法,掌握各种排序算法的优劣,以及各种算法使用的情况。
2实验内容
2.1题目1
使用简单数组实现下面各种排序算法,并进行比较。
排序算法:
1、插入排序
2、希尔排序
3、冒泡排序
4、快速排序
5、简单选择排序
6、堆排序(选作)
7、归并排序(选作)
8、基数排序(选作)
9、其他
要求:
1、测试数据分成三类:
正序、逆序、随机数据
2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其中关键字交换计为3次移动)。
3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒(选作)
4、对2和3的结果进行分析,验证上述各种算法的时间复杂度
编写测试main()函数测试线性表的正确性。
3程序分析
3.1 存储结构
顺序存储结构——数组
3.2 关键算法分析
1.插入排序:
依次将待排序的序列中的每一个记录插入到先前排序好的序列中,直到全部记录排序完毕
voidInsertsort(intr[],intn,int*compare,int*move)//插入排序
{
*compare=0;
*move=0;
inti;
intj;
for(i=1;i { intx=r[i]; for(j=i-1;x { (*compare)++; (*move)++; r[j+1]=r[j]; } if(j>=0)(*compare)++; r[j+1]=x; } } 2.希尔排序: 先将整个序列分割成若干个子列,分别在各个子列中运用直接插入排序,待整个序列基本有序时,再对全体记录进行一次直接插入排序 voidShellInsert(intr[],intn,int*compare,int*move)//希尔排序 { *compare=0; *move=0; intj; 1091212202031 for(intd=n/2;d>=1;d=d/2)//间距越来越小 { for(inti=d;i<=n-1;i++)//从a[d]往后逐个元素确定是否需要前移 { if(r[i] { intx=r[i]; for(j=i-d;(j>=0)&&(x { (*compare)++; (*move)++; r[j+d]=r[j]; } if(j>=0)(*compare)++; r[j+d]=x; } else(*compare)++; } } } 3.冒泡排序: 两两比较相邻记录的关键码,如果反序则交换,直到没有反序记录为止 voidBubblesort(intr[],intn,int*compare,int*move)//交换(冒泡)排序 { *compare=0; *move=0; intx; for(intj=0;j { for(inti=n-1;i>j;i--) { if(r[i] { (*compare)++; (*move)+=3; x=r[i]; r[i]=r[i-1]; r[i-1]=x; } else(*compare)++; } } } 4.快速排序: 首先选择一个基准,将记录分割为两部分,左支小于或等于基准,右支则大于基准,然后对两部分重复上述过程,直至整个序列排序完成 intPartion(intr[],intfirst,intend,int*compare,int*move)//快速排序中的轴定位 { inti=first; intj=end; intzhou=r[i];//默认第一个元素为轴 while(i { while((i { (*compare)++; j--; } if(i { (*compare)++; (*move)++; r[i]=r[j];//发现轴右侧的某数比轴值小,将其前置 } while((i { (*compare)++; i++; } if(i { (*compare)++; (*move)++; r[j]=r[i];//发现轴左侧的某数比轴值小,将其后置 } } r[i]=zhou;//最后确定轴的位置 returni; } voidQsort(intr[],inti,intj,int*compare,int*move)//快速排序 { if(i { intcentre=Partion(r,i,j,compare,move); Qsort(r,i,centre-1,compare,move); Qsort(r,centre+1,j,compare,move); } } 5.选择排序: 从待排序的记录序列中选择关键码最小的记录并将它与序列中的第一个记录交换位置;然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第二个记录交换位置;如此重复,直到序列中只剩下一个记录为止 voidSelectsort(intr[],intn,int*compare,int*move)//选择排序 { *compare=0; *move=0; for(inti=0;i { intmin=i; for(intj=i+1;j { (*compare)++; if(r[j] } if(min! =i) { (*move)+=3; intMin; Min=r[min]; r[min]=r[i]; r[i]=Min; } } } 4程序运行结果 4.1主函数流程图 4.2程序运行框图 5实验心得 1.调试时出现的问题及解决的方法 在初期构思代码的时候,首先构造了各种算法的基本实现代码,封装成类,已经能够实现七种排序的基本功能,并且测试无误。 之后考虑如何能简化代码以实现多达七种排序算法的简单调用、乱序和顺序以及逆序数据的分别排序和性能指标统计(算法移动次数和比较次数的精确统计)。 2.心得体会 程序的优化是一个艰辛的过程,如果只是实现一般的功能,将变得容易很多,当加上优化,不论是效率还是结构优化,都需要精心设计。 3.改进 本程序代码设计时运用了递归的调用方式,效率还可以通过将其转换为栈模拟的方式得以提高。 另外还可以进一步考虑算法时间的精确统计,以便从时间角度比较这几种排序算法的优劣。 完整源代码 #include usingnamespacestd; voidInsertsort(intr[],intn,int*compare,int*move); voidShellInsert(intr[],intn,int*compare,int*move); voidBubblesort(intr[],intn,int*compare,int*move); intPartion(intr[],intfirst,intend,int*compare,int*move); voidQsort(intr[],inti,intj,int*compare,int*move); voidSelectsort(intr[],intn,int*compare,int*move); voidInsertsort(intr[],intn,int*compare,int*move)//插入排序 { *compare=0; *move=0; inti; intj; for(i=1;i { intx=r[i]; for(j=i-1;x { (*compare)++; (*move)++; r[j+1]=r[j]; } if(j>=0)(*compare)++; r[j+1]=x; } } voidShellInsert(intr[],intn,int*compare,int*move)//希尔排序 { *compare=0; *move=0; intj; for(intd=n/2;d>=1;d=d/2)//间距越来越小 { for(inti=d;i<=n-1;i++)//从a[d]往后逐个元素确定是否需要前移 { if(r[i] { intx=r[i]; for(j=i-d;(j>=0)&&(x { (*compare)++; (*move)++; r[j+d]=r[j]; } if(j>=0)(*compare)++; r[j+d]=x; } else(*compare)++; } } } voidBubblesort(intr[],intn,int*compare,int*move)//交换(冒泡)排序 { *compare=0; *move=0; intx; for(intj=0;j { for(inti=n-1;i>j;i--) { if(r[i] { (*compare)++; (*move)+=3; x=r[i]; r[i]=r[i-1]; r[i-1]=x; } else(*compare)++; } } } intPartion(intr[],intfirst,intend,int*compare,int*move)//快速排序中的轴定位 { inti=first; intj=end; intzhou=r[i];//默认第一个元素为轴 while(i { while((i { (*compare)++; j--; } if(i { (*compare)++; (*move)++; r[i]=r[j];//发现轴右侧的某数比轴值小,将其前置 } while((i { (*compare)++; i++; } if(i { (*compare)++; (*move)++; r[j]=r[i];//发现轴左侧的某数比轴值小,将其后置 } } r[i]=zhou;//最后确定轴的位置 returni; } voidQsort(intr[],inti,intj,int*compare,int*move)//快速排序 { if(i { intcentre=Partion(r,i,j,compare,move); Qsort(r,i,centre-1,compare,move); Qsort(r,centre+1,j,compare,move); } } voidSelectsort(intr[],intn,int*compare,int*move)//选择排序 { *compare=0; *move=0; for(inti=0;i { intmin=i; for(intj=i+1;j { (*compare)++; if(r[j] } if(min! =i) { (*move)+=3; intMin; Min=r[min]; r[min]=r[i]; r[i]=Min; } } } voidmain() { inti; intcompare=0; intmove=0; cout<<"请您先输入一个正序数组哦"< intn; cout<<"请输入数组中含有的元素数量: "; cin>>n; int*r=newint[n]; cout<<"请输入数组中的元素: "; for(i=0;i int*a=newint[n]; for(i=0;i Insertsort(a,n,&compare,&move); cout<<"\n插入排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< int*b=newint[n]; for(i=0;i ShellInsert(b,n,&compare,&move); cout<<"希尔排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< int*c=newint[n]; for(i=0;i Bubblesort(c,n,&compare,&move); cout<<"交换排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< compare=0; move=0; int*d=newint[n]; for(i=0;i Qsort(d,0,n-1,&compare,&move); cout<<"快速排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< int*e=newint[n]; for(i=0;i Selectsort(e,n,&compare,&move); cout<<"选择排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< cout<<"再输入一个逆序数组~~~"< cout<<"请输入数组中含有的元素数量: "; cin>>n; cout<<"请输入数组中的元素: "; for(i=0;i for(i=0;i Insertsort(a,n,&compare,&move); cout<<"\n插入排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i ShellInsert(b,n,&compare,&move); cout<<"希尔排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i Bubblesort(c,n,&compare,&move); cout<<"交换排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< compare=0; move=0; for(i=0;i Qsort(d,0,n-1,&compare,&move); cout<<"快速排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i Selectsort(e,n,&compare,&move); cout<<"选择排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< cout<<"最后输入一个乱序数组~~~"< cout<<"请输入数组中含有的元素数量: "; cin>>n; cout<<"请输入数组中的元素: "; for(i=0;i for(i=0;i Insertsort(a,n,&compare,&move); cout<<"\n插入排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i ShellInsert(b,n,&compare,&move); cout<<"希尔排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i Bubblesort(c,n,&compare,&move); cout<<"交换排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< compare=0; move=0; for(i=0;i Qsort(d,0,n-1,&compare,&move); cout<<"快速排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< for(i=0;i Selectsort(e,n,&compare,&move); cout<<"选择排序结果为: "; for(i=0;i cout<<"\n比较次数为"< cout<<"\n移动次数为"< }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告 排序
![提示](https://static.bdocx.com/images/bang_tan.gif)