二分查找

二分查找

前提:有序数组。

一、建立数组

二、传参

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= (9)/= 8时; 27==27return middle 

 

[特例]

如果要找元素在边上的话,如36,那么下一次就是left=9;right=9;自然middle也等于9。

[总结]

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

 [代码]

 1 #include<iostream>
 2 using namespace std;
 3 
 4 int search(int array[], int n, int v)
 5 {
 6     int left, right, middle;
 7     left = 0, right = n - 1;
 8 
 9     while (left <= right) 
10     {
11         middle = (left + right) / 2;
12         if (array[middle] > v) 
13             right = middle - 1;
14         else if (array[middle] < v) 
15             left = middle + 1;
16         else 
17             return middle;
18     }
19     return -1;
20 }
21 
22 
23 int main()
24 {
25     int array[10] = {1, 2, 3, 6, 7, 7, 8, 9, 13, 19};
26     cout << search(array, 10, 19) << endl;
27     return 0;
28 }

 参考资料

1. 分块查找

原文地址:https://www.cnblogs.com/sunbines/p/9152730.html