今天干脆来做个作业,介绍一下二分搜索算法。
题目中给了七个二分搜索算法(BinarySearch)略有不同,要求判断七个二分搜索算法的正确性,并说明。
算法1:正确算法
int BinarySearch(int a[],int 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;
算法2:正确
int BinarySearch(int a[],int x,int n){
int left=0;
int right=n-1;
while (left<right-1){
int middle=(left + right)/2;
//if(x==a[middle]) return middle;
if(x<a[middle]) right =middle;
else left =middle;
}
if(x==a[left]) return left;
else return -1;
}
算法3:正确
int left=0;
int right=n-1;
while (left+1!=right){
int middle=(left + right)/2;
//if(x==a[middle]) return middle;
if(x>=a[middle]) left =middle;
else right =middle;
}
if(x==a[left]) return left;
else return -1;
}
算法4:错误,之后中间变量之后的可以查找成功。中间变量之前的会陷入死循环。
int BinarySearch(int a[],int x,int n){
if(n>0&&x>=a[0]){
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]) right =middle-1;
else left =middle;
}
if(x==a[left]) return left;
}
return -1;
}
算法5:
int BinarySearch(int a[],int x,int n){
if(n>0&&x>=a[0]){
int left=0;
int right=n-1;
while (left<right){
int middle=(left + right+1)/2;
//if(x==a[middle]) return middle;
if(x<a[middle]) right =middle-1;
else left =middle;
}
if(x==a[left]) return left;
}
return -1;
}
算法6:错误
int BinarySearch(int a[],int x,int n){
if(n>0&&x>=a[0]){
int left=0;
int right=n-1;
while (left<right){
int middle=(left + right+1)/2;
//if(x==a[middle]) return middle;
if(x<a[middle]) right =middle-1;
else left =middle+1;
}
if(x==a[left]) return left;
}
return -1;
}
算法7:错误,陷入死循环;
int BinarySearch(int a[],int x,int n){
if(n>0&&x>=a[0]){
int left=0;
int right=n-1;
while (left<right){
int middle=(left + right+1)/2;
//if(x==a[middle]) return middle;
if(x<a[middle]) right =middle;
else left =middle;
}
if(x==a[left]) return left;
}
return -1;
}
以上仅作为自己练习,如有错误,敬请指正,多谢!