二分查找是一种在有序数组中查找某一特定元素的查找算法。
查找过程从数组的中间元素开始:
如果中间元素正好是要查找的元素,则查找过程结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
特点:「连续」「单调」「确切答案」
解通常是唯一的,或者不存在。
法一:(递归方法的二分查找:)
#include<iostream>
#include<algorithm>
using namespace std;
int binary_Search(int a[],int left,int right,int value){
if(left>right) return -1;
int mid=(left+right)/2;
if(a[mid]==value) return mid;
if(value>a[mid]) return binary_Search(a,mid+1,right,value);
else return binary_Search(a,left,mid-1,value);
}
int main(){
int aa[]={2,5,7,1,9,4};
sort(aa,aa+6);
for(int i=0;i<sizeof(aa)/sizeof(aa[0]);i++){
cout<<aa[i]<<" ";
}
cout<<endl;
int n=binary_Search(aa,0,5,4);
cout<<n<<endl;
return 0;
}
法二:(非递归的二分查找:)
#include<iostream>
#include<algorithm>
using namespace std;
int binary_Search(int a[],int left,int right,int value){
while(left<=right){
int mid=(left+right)/2;
if(a[mid]==value) return mid;
if(value>a[mid]) left=mid+1;
else right=mid-1;
}
}
int main(){
int aa[]={2,5,7,1,9,4};
sort(aa,aa+6);
for(int i=0;i<sizeof(aa)/sizeof(aa[0]);i++){
cout<<aa[i]<<" ";
}
cout<<endl;
int n=binary_Search(aa,0,5,4);
cout<<n<<endl;
return 0;
}