二分查找
#include <string.h>
#include <iostream>
using namespace std;
int Bin_Search(int A[],int n,int k)
{
int low=0;
int high=n-1;
int mid;
while(low<=high)
{
mid=(low+high+1)/2;
if(A[mid]==k)
{
return mid;
}
else if(A[mid]<k)
{
low=mid+1;
}
else
{
high=mid-1;
}
}
return 0;
}
int main()
{
int n;
cin>>n;
int A[n];
int i;
for(i=0;i<n;i++)
{
cin>>A[i];
}
int k,AD;
cin>>k;
AD=Bin_Search(A,n,k);
cout<<AD<<endl;
return 0;
}
注 :
有些代码的low初始化为0=1,high初始化为n,mid=(low+high)/2。 其实和上述代码原理是一致的,最终都会输出所查找元素在数组中的位置,但会造成数组越界。
我们举个栗子,假如我们数组是{ 1 , 3 },我们从中查找元素1.
根据我们上述代码
第一次 low=1 high=2 mid=(1+2)/2=1 (二分查找向下取整)
key=1 < A[mid]即A[1]=3
第二次 low=1 high=0 mid=(1+0)/2=0 ,此时就输出return 0 了。但实质上,遗漏了A[0]
为什么low<=high,而不是low<high?
我们举个栗子,假如我们数组是{ 1 , 3 },我们从中查找元素1.
根据我们上述代码
第一次 low=0 high=1 mid=(0+1+1)/2=1 (二分查找向下取整)
key=1 < A[mid]即A[1]=3
第二次 low=0 high=0 mid=(0)/2=0
key=1 = A[mid]即A[0]=1(找到了)
但是如果条件是low<high,这个时候,我们还是会遗漏下A[0]。
1239

被折叠的 条评论
为什么被折叠?



