实现二分搜索、合并排序、快速排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、实验题目实现二分搜索、合并排序、快速排序
2、实验要求用分治法和递归技术实现上述问题,掌握设计有效算法的分治
策略
3、实验内容(问题描述、算法设计、算法效率)
实现二分搜索
A.问题描述:给定已排好序的n个元素a[0:n-1],现要在这n个元素中找出
一给定元素x。
B.算法设计:在问题中,n个元素已经排好序,二分搜索算法的基本思想是
将n个元素分成个数大致相同的两半,取a[n/2]与x作比较,如果x=a[n/2],则找到x,算法终止;如果xa[n/2],则只要在数组a的右半部继续按上方法搜索,直到搜索x。
C.算法效率:每执行一次算法的while循环,待搜索数组的大小减少一半。
因此,在最坏情况下,while循环被执行了O[logn]次。循环体内运算需要O[1]时间,因此整个算法在最坏情况下的计算时间复杂性为O[longn]。
D.代码:
template
int BinarySeatch(Type a[],const Type& x,int n)
{ int left=0; int right = n-1;
while(left<=right){
int middle = (left+right)/2;
if(x = = a[middle])return middle;
if(x>a[middle])left=middle+1;
else right = middle –1;}
return –1;}
实现合并排序
A.问题描述:对n个元素进行排序。
B.算法设计:将待排序元素分成大小大致想通的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
C.算法效率:自然合并排序算法需要O(n)时间,算法MergeSort需要O(nlogn)时间。
D.代码:
void mergesort(int a[],int n)
{int *b=new int[n];
int s=1;
while(s mergepass(a,b,s,n); s+=s; mergepass(b,a,s,n); s+=s;}} void mergepass(int x[],int y[],int s,int n) {int i=0; while(i<=n-2*s) {merge(x,y,i,i+s-1,i+2*s-1); i=i+2*s;} if(i+s merge(x,y,i,i+s-1,n-1); else for(int j=i;j<=n-1;j++) y[j]=x[j];} void merge(int c[],int d[],int l,int m,int r) {int i=l,j=m+1,k=l; while((i<=m)&&(j<=r)) if(c<=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.问题描述:对n个数进行排序 B.算法设计:对于输入的子数组a[p:r],按以下三个步骤进行排序。(1)分解:以a[p]为基准元素将a[p:r]划分成3段a[p:q-1],a[q]和a[q+1:r],使a[p:q-1]中任何一个元素小于等于a[q],而a[q+1:r]中任何一个元素大于等于a[q]。下标q在划分过程中确定。(2)递归求解:通过递归调用快速排序算法分别对a[p:q-1]和a[q+1:r]进行排序。(3)合并 C.算法效率:O(nlogn) D.代码:void quicksort(int a[],int p,int r) { if(p int q=partition(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); } } int partition(int a[],int p,int r){ int i=p,j=r+1; int t; int x=a[p]; while(true){ while(a[++i] while(a[--j]>x); if(i>=j)break; t=a; a=a[j]; a[j]=t;} a[p]=a[j]; a[j]=x; return j;} 4.实验心得 在实现二分搜索是需要先编写一个算法用来输入排好序的n个元素,以用来做搜索源。而合并搜索应用的是依次重复把元素分为大致相同的两组,直到最后的分株可以很容易的比较,之后逐步合并。程序输入是注意保持变量前后一致,勿输入错误。实验中发现了几个平时不容易注意的小问题,加深了对这几个算法的 理解与掌握。