




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实 验 报 告(2015 / 2016 学年 第 二学期)课程名称实验名称分治法实现快速排序与两路合并排序实验时间年月日指导单位计算机学院计算机科学与技术系指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称分治法指导教师实验类型验证实验学时2实验时间一、 实验目的和要求实验目的: 理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法的算法原理及实现过程的理解。 实验要求: 用分治法实现一组无序序列的两路合并排序和快速排序。要求清楚合并排序及快速排序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出。 二、实验环境(实验设备) 硬件:微型计算机 软件:Windows 操作系统、Microsoft Visual C+6.03、 实验原理及内容 实验原理: 分治法:即分而治之。将问题分解为规模较小,相互独立,类型相同的问题进行求解。对于无序数组的有序排序也就是按某种方式将序列分成两个或多个子序列,分别进行排序,再将已排序的子序列合并成一个有序序列。 实验内容: 两路合并排序算法的基本思想是:将待排序元素序列一分为二,得到两个长度基本相等的子序列,其过程类似于对半搜索;然后将子序列分别排序,如果子序列较长,还可以继续细分,知道子序列长度不超过1为止。以上的实现由下列代码执行: void SortableList:MergeSort() MergeSort(0,n-1); void SortableList:MergeSort(int left,int right) if (leftright) int mid=(left+right)/2; MergeSort(left,mid); MergeSort(mid+1,right); Merge(left,mid,right); 函数MergeSort是类SortableList上的公有成员函数。mid=(left+right)/2;将函数划分为两个长度基本相等的子序列,用递归来执行两个子序列的内部排序。而Merge函数是将有序的子序列合并,通过合并过程将自问题的解组合成元问题的解。通过比较两个序列中的最小者,输出其中的较小者,重复此过程,直到一个序列为空,如果还有元素为输出则输出即可。其中对于Merge函数代码如下:void SortableList:Merge(int left,int mid,int right)/将两个长度之和为n的有序子序列合并一个有序序列 int *temp=new intright-left+1; int i=left,j=mid+1,k=0; while(i=mid)&(j=right) if (li=lj) tempk+=li+; else tempk+=lj+; while (i=mid) tempk+=li+; while (j=right) tempk+=lj+; for (i=0,k=left;k=right;) lk+=tempi+;快速排序算法的基本思想是: 在待排序序列 Kleft:right上选择一个基准元素(通常是最左边的元素),通过一趟分划操作将序列分成左右两个子序列,左子序列中所有元素都小于等于该基准元素,有子序列中所有元素都大于等于该基准元素。划分操作如下:int SortableList:Partition(int left,int right)int i=left,j=right+1;dodo i+; while (lilleft);if (ij) Swap(i,j);while (ij);Swap(left,j);return j;则当前基准元素所在的位置位于左、右子序列的中间,即是其排序完成后的最终位置。通过递归调用,对左子序列和右子序列再分别进行快速排序算法的调用。由于每一趟分划结束后,左子序列中的元素均不大于基准元素,右子序列中的元素均不小于基准元素。而每次分划后,对分划得到的左、右子序列的快速排序又均是就地进行,所以一旦左、右两个子序列都已分别排好序后,无需再执行任何计算,整个序列就是所要求的有序序列了。因此类中应定义成员函数 QuickSort来完成递归快速排序算法的调用和成员函数。快速排序操作如下:void SortableList:QuickSort()QuickSort(0,n-1);void SortableList:QuickSort(int left,int right)if (leftright)int j=Partition(left,right);QuickSort(left,j-1);QuickSort(j+1,right);比较合并排序和快速排序的异同。 合并排序将序列一分为二即可。 快速排序需调用 Partition函数将一个序列划分为子序列。子问题解合并得到原问题解的过程:合并排序需要调用 Merge函数来实现。(Merge函数时间复杂度为O(n)).快速排序一旦左、右两个子序列都已分别排序,整个序列便自然成为有序序列。程序中的其他函数:输入输出函数:void SortableList:Input() for(int i=0;ili; n+; void SortableList:Output() for(int i=0;imaxSize;i+) coutli ; 主函数:void main() int n; int i; cout *endlendl; cout 1 两路合并排序 2 快速排序 endlendl; cout *endlendl; while(1) cout *请选择排序方式*i; if(i!=1&i!=2) coutfaultendl; break; cout * 请输入比较个数 * n; SortableList l(n); cout* 请输入n个数:*endl; l.Input(); if(i=1) l.MergeSort();else l.QuickSort(); cout* 排序后序列是: *endl; l.Output(); coutendl; 实验结果:实验用例(1)72 26 57 88 42 80 72 48 60(2)0 0 0 0 0完整实验代码:#includeclass SortableList public: SortableList(int mSize)/构造函数 maxSize=mSize; l=new intmaxSize; n=0; SortableList()/析构函数 delete l; void MergeSort(); void QuickSort(); void Input(); void Output(); private: int *l; int maxSize; int n; void MergeSort(int left,int right); void Merge(int left,int mid,int right); void Swap(int i,int j); void QuickSort(int left,int right); int Partition(int left,int right); void SortableList:Swap(int i,int j)int c=li;li=lj;lj=c;int SortableList:Partition(int left,int right)int i=left,j=right+1;dodo i+; while (lilleft);if (ij) Swap(i,j);while (ij);Swap(left,j);return j;void SortableList:QuickSort()QuickSort(0,n-1);void SortableList:QuickSort(int left,int right)if (leftright)int j=Partition(left,right);QuickSort(left,j-1);QuickSort(j+1,right); void SortableList:MergeSort() MergeSort(0,n-1); void SortableList:MergeSort(int left,int right) if (leftright) int mid=(left+right)/2; MergeSort(left,mid); MergeSort(mid+1,right); Merge(left,mid,right); void SortableList:Merge(int left,int mid,int right)/将两个长度之和为n的有序子序列合并一个有序序列 int *temp=new intright-left+1; int i=left,j=mid+1,k=0; while(i=mid)&(j=right) if (li=lj) tempk+=li+; else tempk+=lj+; while (i=mid) tempk+=li+; while (j=right) tempk+=lj+; for (i=0,k=left;k=right;) lk+=tempi+;void SortableList:Input() for(int i=0;ili; n+; void SortableList:Output() for(int i=0;imaxSize;i+) coutli ; void main() int n; int i; cout *endlendl; cout 1 两路合并排序 2 快速排序 endlendl; cout *endlendl; while(1) cout *请选择排序方式*i; if(i!=1&i!=2) coutfaultendl; break; cout * 请输入比较个数 * n; SortableList l(n);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高端系统门窗合同范本
- 房产采购家电合同范本
- 外贸劳务英文合同范本
- 咳嗽变异性哮喘雾化吸入护理查房
- 包子店劳务合同范本
- 毛坯租房合同范本
- 模具快速原型制作合同
- 房屋自动延续合同范本
- 装卸及安装合同范本
- 地瓜基地采购合同范本
- 膀胱灌注的护理课件
- 桥梁安全保护区管理制度
- 学堂在线 大学生国家安全教育 章节测试答案
- 2025至2030中国增强型飞行视觉系统行业发展趋势分析与未来投资战略咨询研究报告
- 华文版二年级上册-写字-书法
- 学堂在线 数据结构(上) 章节测试答案
- 安全文明生产的保证措施
- 车辆运输安全培训
- 工贸企业安全培训课件
- 长沙市太平街、西文庙坪历史文化街区保护提升项目可行性研究报告
- 业绩分红方案(3篇)
评论
0/150
提交评论