2分查找

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

贵州师范大学数学与计算机科学学院实验报告

课程名称:算法设计与分析班级:13计本实验日期:学号:3姓名:陈指导教师:熊祥光成绩:

一、实验名称

二分查找算法和快速排序算法

二、实验目的及要求

1、掌握分治法的基本思想;

2、利用分治法思想,编程实现二分查找算法和快速排序算法;

3、能对所设计算法的计算复杂性进行分析;

4、对于给定的实例,能给出相应算法的计算过程。

三、实验工具

XP系统或Win 7系统,编程语言不限

四、实验内容

(一)、二分查找问题

以下为二分查找算法的源代码:

#include

using namespace std;

int Binarysearch(int arry[],int n,int x)

{

int left=0,right=n-1;int middle;

while(left<=right)

{

middle=(left+right)/2;

if(arry[middle]==x)return middle;

else if(arry[middle]

else right=middle-1;

}

return-1;

}

void main()

{

int m;int a[6]={1,2,3,4,5,6};

m=Binarysearch(a,6,0);

cout<

}

在代码的倒数第三行红圈处分别设定要查找的值0

和4。

计算过程:当x=0时,left=0,right=5,left小于right;middle=2。x不等于2

且x小于2,故现在数组a的左半部分搜索x,此时left=0,right=middle-1=1,Middle=0;a[0]=1不等于0且不小于0,故right=1-1=0;left=0,right=0,故middle=0,a[0]=1不等于0且不小于0,故right=0-1=-1;此时left=0大于right,程序结束返回-1,未找到x=0时的位置。

当x=4时,left=0,right=5,left小于right;middle=2。x不等于2且x大于2,故现在数组a的右半部分搜索x,此时left=middle+1=1,right=5;程序循环left 小于right,middle=3,a[3]=4,返回3,m输出3,程序结束。

算法实践复杂性分析:每次执行一次While循环,待搜索数组的大小减少一半,在最坏情况下:T(n)=O(1) n=1;T(n/2)+O(1) n>1,故在最坏情况下,整个算法的时间复杂性为O(logn).

2、在二分查找算法的基础上,实现三分查找算法并对算法的复杂性进行分析。

以下为三分查找算法的源代码:

#include

using namespace std;

int Binarysearch(int arry[],int n,int x)

{

int left=0,right=n-1,int m1,int m2;

while(left<=right)

{

m1=left+(right-left)/3;m2=right-(right-left)/3;

if(x==arry[m1])return m1;

else if(x

else if(x==arry[m2])return m2;

else if(x>arry[m2])left=m2+1;

else left=m1+1,right=m2-1;

}

return-1;

}

void main()

{

int m;int a[6]={1,2,3,4,5,6};

m=Binarysearch(a,6,0);

cout<

}

在代码的倒数第三行红圈处分别设定要查找的值0

和4。

计算过程:当x=0时,left=0,right=5,left小于right,程序开始循环,

m1=0+(5-0)/3=1,m2=5-(5-0)/3=4,判断x与arry[m1]和arry[m2]的大小关系,arry[m1]=2,arry[m2]=5,0

当x=4时,left=0,right=5,left小于right,程序开始循环,m1=0+(5-0)/3=1,m2=5-(5-0)/3=4,判断x与arry[m1]和arry[m2]的大小关系,arry[m1]=2,

arry[m2]=5;4>arry[m1]执行else语句left=m1+1=2,4

arry[m2]=4,4=arry[m2]返回m2=3,找到4在第三位,程序结束。

算法实践复杂性分析:每次执行一次While循环,待搜索数组的大小减少一半,在最坏情况下:T(n)=O(1) n=1;T(n/3)+O(1) n>1,故在最坏情况下,整个算法的时间复杂性为O(log3n)

(二)、快速排序问题

1、编程语言不限,实现快速排序算法并对算法的复杂性进行分析。

以下为快速排序算法的源代码:

#include

using namespace std;

int Partition(int a[],int p,int r)

{

int i=p,j=r+1;int k;

int x=a[p];

while(true)

{

while(a[++i]

while(a[--j]>x);

if(i>=j) break;

k=a[i],a[i]=a[j],a[j]=k;

}

a[p]=a[j];

a[j]=x;

return j;

}

void quickSort(int a[],int p,int r)

{

if(p

{

相关文档
最新文档