实验二:归并排序的分治策略设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二:归并排序的分治策略设计实验目的:掌握使用分治策略消除递归;基本掌握分治策略的原理方法。
实验原理: 分治策略
实验步骤:利用分治策略编程实现合并排序,教材P21-22;
问题描述:合并排序(MERGE SORT),是用分之策略实现对n个元素进行排序的算法。合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。
算法思想:基本思想是将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
方案一:假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个N/2个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
方案二:给定n个元素(也叫关键字)序列a[1], ..., a[n],将其划分为两个集合a[1], ..., a[n/2]和a[n/2+1], ..., a[n]。每个集合各自进行排序,归并所得的有序序列可以得到一个新的有n个元素的有序序列。在其中,分解操作是得到两个相同大小的集合,而归并操作将两个有序集合合二为一。
实验要求:(1)使用C++或TC2.0 (2)上机前要有源代码或流程图。
#include
#include
//这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]
template
void Copy(T a[],T b[],int left,int right)
{
int size=right-left+1;
for(int i=0;i { a[left++]=b[i]; } } //这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b template void Merge(Type c[],Type d[],int l,int m,int r) { int i=l,j=m+l,k=l; while((i<=m)&&(j<=r)) if(c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; if(i>m)for(int q=j;q<=r;q++) d[k++]=c[q]; else for(int q=i;q<=m;q++) d[k++]=c[q]; } //对数组a[left:right]进行合并排序template void MergeSort(Type a[],int left,int right) { if(left int i=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } } //from /zhangamxqun int main() { int n; cout<<"how many numbers to sort:"; cin>>n; int *a=new int[n]; cout<<"input "< for(int i=0;i {cin>>a[i];} MergeSort( a, 0, n-1); for(int j=0;j { cout< } cout< return 1; } template void MergeSort(Type a[],int left,int right) { if(left int i=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } } template void MergeSort(Type a[],int n) { Type*b = new Type[n]; int s=1; while(s MergePass(a,b,s,n); s+=s; MergePass(b,a,s,n); s+=s; } } template void MergePass(Type x[],Type y[],int s,int n) { int i; while(i<=n-2*s) { Merge(x,y,i,i+s-1,i+2*s-1); i=i+2*s; } if(i+s else for(int j=i;j<=n-1;j++) y[j]=x[j]; } template void Merge(Type c[],Type d[],int l,int m,int r) { int i=l,j=m+l,k=l; while((i<=m)&&(j<=r)) if(c[i]<=c[j]) d[k++]=c[i++]; else d[k++]=c[j++]; if(i>m)for(int q=j;q<=r;q++) d[k++]=c[q]; else for(int q=i;q<=m;q++) d[k++]=c[q]; }