分治法实现归并排序算法算法设计与分析实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

} private: sqlist b; int n; }; void main() { cout<<"kuaisu1.cpp运行结果:\n"; sqlist a1; int i,n=MAXI,low=0,high=9; srand(time(0)); for(i=0;i<n;i++) a1[i].key=rand()%80; kuaisu px(a1,n); cout<<"数组排序过程演示:\n"; px.quicksort(low,high); cout<<"排序后数组:\n"; px.output(); cin.get(); }
来自百度文库
二.实验内容
1.编程实现归并排序算法,程序中加入比较次数的计数功能,输出排 序结果和比较次数。 2.输入10组相同的数据,验证排序结果和完成排序的比较次数。 3.与复杂性函数所计算的比较次数比较。 4.用表格列出比较结果。 5.给出文字分析。
三.程序算法
1. 归并排序算法
procedure MERGESORT(low,high) //A(low;high)是一个全程数组,它含 有high-low+1≥0个待排序的元素// integer low,high; if low<high; then mid← , //求这个集合的分割点// call MERGESORT(low,mid) //将一个子集合排序// call MERGESORT(mid+1,high) //将另一个子集合排序 call MERGE(low,mid,high) //归并两个已排序的子集 合// endif end MERGESORT 归并两个已排序的集合 procedure MERGE(low,mid,high) //A(low:high)是一个全程数组// //辅助数组B(low;high)// integer h,i,j,k; h←low;i←low;j←mid+1; while h≤mid and j≤high do //当两个集合都没取尽 时// if A(h)≤A(j) then B(i) ←A(h);h←h+1 else B(i) ←A(j);j←j+1 endif i←i+1 repeat if h>mid then for k←j to high do //处理剩余的元素// B(i) ←A(k);i←i+1 repeat else for k←h to mid do B(i) ←A(k);i←i+1 repeat endif 将已归并的集合复制到A end MERGE
sqlist r; }; void main() { cout<<"guibingfa1运行结果:\n"; sqlist a,b; int i,j=0,k=M/2,n=M; srand(time(0)); for(i=0;i<M;i++) { a[i].key=rand()%80;b[i].key=0; } guibing gx(a); cout<<"排序前数组:\n"; gx.output(a,M); cout<<"数组排序过程演示:\n"; gx.merge(j,k,n,b); cout<<"排序后数组:\n"; gx.output(b,M); cin.get(); } 2. 快速排序 #include<iostream.h> #include<iomanip.h> #include<stdlib.h> #include<time.h> #define MAXI 10 typedef int KeyType; typedef int ElemType; struct rec{ KeyType key; ElemType data; }; typedef rec sqlist[MAXI]; class kuaisu {
public: kuaisu(sqlist a,int m):n(m) { for(int i=0;i<n;i++) b[i]=a[i]; } void quicksort(int s,int t) { int i; if(s<t){ i=part(s,t); quicksort(s,i-1); quicksort(i+1,t); } else return; } int part(int s,int t) { int i,j; rec p; i=s;j=t;p=b[s]; while(i<j) { while(i<j&&b[j].key>=p.key)j--; b[i]=b[j]; while(i<j&&b[i].key<=p.key)i++; b[j]=b[i]; } b[i]=p; output(); return i; } void output() { for(int i=0;i<n;i++) cout<<setw(4)<<b[i].key; cout<<endl;
五. 程序调试中的问题
相同数字在比较的过程中会使用很多的时间,不能提高排序的速度
六.实验结果
1. 归并排序
2. 快速排序
2. 快速排序算法 QuickSort(p,q) //将数组A[1:n]中的元素 A[p], A[p+1], , A[q]按不降次序排列, 并假定A[n+1]是一个确定的、且大于 A[1:n]中所有的数。// int p,q; global n, A[1:n]; if p<q then j=Partition(p, q+1); // 划分后j成为划分元素的位置 QuickSort(p,j-1); QuickSort(j+1,q); endif end QuickSort procedure PARTITION(m,p) //退出过程时,p带着划分元素所在的下标位置。// integer m,p,i;global A(m:p-1) v←A(m);i←m //A(m)是划分元素// loop loop i←i+1 until A(i)≥v repeat //i由左向右移// loop p←p-1 until A(p)≤v repeat //p由右向左移// if i<p then call INTERCHANGE(A(i),A(p)) //A(i)和A(p)换 位// else exit endif repeat A(m) ←A(p);A(p) ←v //划分元素在位置p// End PARTITION
算法设计与分析实验报告
实验名称 实验日期 姓名 年 分治法实现归并排序算法 月 日 指导教师 评分
专业班级 学号
一.实验要求
1.了解用分治法求解的问题:当要求解一个输入规模为n,且n的取 值相当大的问题时, 如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问 题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这 些子问题的解合并得出。那末,对于这类问题分治法是十分有效的。 2.掌握分治法的一般控制流程。 DanC(p,q) global n,A[1:n]; integer m,p,q; // 1pqn if Small(p,q) then return G(p,q); else m=Divide(p,q); // pm<q return Combine(DanC(p,m),DanC(m+1,q)); endif end DanC 3.实现典型的分治算法的编程与上机实验,验证算法的时间复杂性 函数。
void merge(int l,int m,int h,sqlist r2) { xuanze(r,l,m); xuanze(r,m,h); output(r,M); int i,j,k; k=i=l; for(j=m;i<m&&j<h;k++) { if(r[i].key<=r[j].key) { r2[k]=r[i]; i++; } else { r2[k]=r[j]; j++; } output(r2,M); } while(j<h) { r2[k]=r[j]; j++; k++; } while(i<=m) { r2[k]=r[i]; i++; k++; } output(r2,M); } private:
四. 程序代码
1. 归并排序 #include<iostream.h> #include<iomanip.h> #include<stdlib.h> #include<time.h> #define M 11
typedef int KeyType; typedef int ElemType; struct rec{ KeyType key; ElemType data; }; typedef rec sqlist[M]; class guibing{ public: guibing(sqlist b) { for(int i=0;i<M;i++) r[i]=b[i]; } void output(sqlist r,int n) { for(int i=0;i<n;i++) cout<<setw(4)<<r[i].key; cout<<endl; } void xuanze(sqlist b,int m,int n) { int i,j,k; for(i=m;i<n-1;i++) { k=i; for(j=i;j<n;j++) if(b[k].key>b[j].key) k=j; if(k!=i) { rec temp=b[k]; b[k]=b[i]; b[i]=temp; } } }
相关文档
最新文档