实现二分搜索、合并排序、快速排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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个元素,以用来做搜索源。而合并搜索应用的是依次重复把元素分为大致相同的两组,直到最后的分株可以很容易的比较,之后逐步合并。程序输入是注意保持变量前后一致,勿输入错误。实验中发现了几个平时不容易注意的小问题,加深了对这几个算法的

理解与掌握。

相关文档
最新文档