1 #include"iostream.h" 2 3 int BinarySearch(int a[],int left,int right,const int& x) 4 { 5 if(left<right) 6 { 7 int middle = (left+right)/2; 8 if(x==a[middle]) return middle; 9 if(x>a[middle]) return BinarySearch(a,middle+1,right,x); 10 else return BinarySearch(a,left,middle-1,x); 11 } 12 } 13 14 void main(){ 15 int n,x,i,a[99]; 16 cout<<"input the length of a[]"<<endl; 17 cin>>n; 18 cout<<"input array a[]"<<endl; 19 for(i=0;i<n;i++) cin>>a[i]; 20 cout<<"input the num u want to find"<<endl; 21 cin>>x; 22 cout<<BinarySearch(a,0,n-1,x)+1<<endl; 23 }
[图解+例子]
前提:有序数组。
一、建立数组
(共10个数)
二、传参
int a[] 数组
int left,int right 当前查找范围限定(left=0;right=n-1;10个数即n=10;left=0;right=9)
const int& x 待查找数值(假如查找27)
三、取中间值middle判断
如果27==7 返回当前middle值(0+9)/2=4
如果27>7查找右半段
if (x>a[middle]) return BinarySearch(a,middle+1,right,x); //设定右半段范围(right值不变middle+1)
如果27<7查找左半段
else return BinarySearch(a,left,middle-1,x);//设定左半段范围(left值不变middle-1)
当前查找右半段即 left=5;right=9
如果27==25 返回当前middle值(5+9)/2=7
……
……
如此继续递归调用BinarySearch函数
直到middle=(8+9)/2=8时 ;27==27;return middle
[特例]
如果要找元素在边上的话,如36,那么下一次就是left=9;right=9;自然middle也等于9。
[总结]
子问题:范围内取中值;递归不断缩小确定范围。