[图解算法] 二分查找Binary-Search——<递归与分治策略>

 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 }
View Code

[图解+例子]

前提:有序数组。

一、建立数组

(共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。

[总结]

子问题:范围内取中值;递归不断缩小确定范围。

原文地址:https://www.cnblogs.com/cc1997/p/7710780.html