2分查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 {