实验二归并排序的分治策略设计.docx
- 文档编号:6885368
- 上传时间:2023-01-12
- 格式:DOCX
- 页数:8
- 大小:16.31KB
实验二归并排序的分治策略设计.docx
《实验二归并排序的分治策略设计.docx》由会员分享,可在线阅读,更多相关《实验二归并排序的分治策略设计.docx(8页珍藏版)》请在冰豆网上搜索。
实验二归并排序的分治策略设计
实验二:
归并排序的分治策略设计
实验目的:
掌握使用分治策略消除递归;基本掌握分治策略的原理方法。
实验原理:
分治策略
实验步骤:
利用分治策略编程实现合并排序,教材P21-22;
问题描述:
合并排序(MERGESORT),是用分之策略实现对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
voidCopy(Ta[],Tb[],intleft,intright)
{
intsize=right-left+1;
for(inti=0;i { a[left++]=b[i]; } } //这个函数合并有序数组a[left: i],a[i+1: right]到b,得到新的有序数组b template voidMerge(Typec[],Typed[],intl,intm,intr) { inti=l,j=m+l,k=l; while((i<=m)&&(j<=r)) if(c[i]<=c[j])d[k++]=c[i++]; elsed[k++]=c[j++]; if(i>m)for(intq=j;q<=r;q++)d[k++]=c[q]; elsefor(intq=i;q<=m;q++)d[k++]=c[q]; } //对数组a[left: right]进行合并排序 template voidMergeSort(Typea[],intleft,intright) { if(left inti=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } } //from intmain() { intn; cout<<"howmanynumberstosort: "; cin>>n; int*a=newint[n]; cout<<"input"< "; for(inti=0;i {cin>>a[i];} MergeSort(a,0,n-1); for(intj=0;j { cout< } cout< return1; } template voidMergeSort(Typea[],intleft,intright) { if(left inti=(left+right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right); Copy(a,b,left,right); } } template voidMergeSort(Typea[],intn) { Type*b=newType[n]; ints=1; while(s MergePass(a,b,s,n); s+=s; MergePass(b,a,s,n); s+=s; } } template voidMergePass(Typex[],Typey[],ints,intn) { inti; while(i<=n-2*s){ Merge(x,y,i,i+s-1,i+2*s-1); i=i+2*s; } if(i+s elsefor(intj=i;j<=n-1;j++)y[j]=x[j]; } template voidMerge(Typec[],Typed[],intl,intm,intr) { inti=l,j=m+l,k=l; while((i<=m)&&(j<=r)) if(c[i]<=c[j])d[k++]=c[i++]; elsed[k++]=c[j++]; if(i>m)for(intq=j;q<=r;q++)d[k++]=c[q]; elsefor(intq=i;q<=m;q++)d[k++]=c[q]; } #include #include inta[100]; voidmerge(intstart,intmid,intend) { inti,j,k; intn1=mid-start+1;0 intn2=end-mid; int*left=(int*)malloc(sizeof(int)*n1); int*right=(int*)malloc(sizeof(int)*n2); for(i=0;i left[i]=a[start+i]; for(i=0;i right[i]=a[mid+i+1]; i=0; j=0; k=start; while(i { if(left[i] a[k++]=left[i++]; else a[k++]=right[j++]; } while(i a[k++]=left[i++]; while(j a[k++]=right[j++]; } voidsort(intstart,intend) { intmid; if(start { mid=(start+end)/2; sort(start,mid); sort(mid+1,end); merge(start,mid,end); } } intmain() { inti,n; while(scanf("%d",&n)! =EOF) { for(i=0;i scanf("%d",&a[i]); sort(0,n-1); for(i=0;i printf("%d",a[i]); printf("\n"); } return0; } #include #include //这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right] template voidCopy(Ta[],Tb[],intleft,intright) { intsize=right-left+1; for(inti=0;i { a[left++]=b[i]; } } //这个函数合并有序数组a[left: i],a[i+1: right]到b,得到新的有序数组b template voidMerge(Ta[],Tb[],intleft,inti,intright) { inta1cout=left,//指向第一个数组开头 a1end=i,//指向第一个数组结尾 a2cout=i+1,//指向第二个数组开头 a2end=right,//指向第二个数组结尾 bcout=0;//指向b中的元素 for(intj=0;j { if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到b if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 归并 排序 分治 策略 设计