1 /*
2 折半查找 = 二分查找
3 2的n次数 = m ,那么在m个数据中,查找1个数据,只需要n次
4
5 效率非常高,对于海量数据非常高效
6
7 前提是: 该数组已经排序过了
8 */
9
10
11
12 #include "BinarySearch.h"
13 #include <iostream>
14 using namespace std;
15 int BinarySearch(int *a,int nLen,int nNumberic);
16
17 int main()
18 {
19 const int nLen = 10;
20 int list[nLen] = {1,2,3,4,5,6,7,8,9,10};
21 int nNeedNumberic = 11;
22
23 int nRet = BinarySearch(list,nLen,nNeedNumberic);
24 if (-1 == nRet)
25 {
26 cout <<"二分查找:没找到"<<endl;
27 }
28 else
29 {
30 cout <<"二分查找:找到了!"<<endl;
31 }
32
33 system("pause");
34 return 0;
35 }
36
37
38 //二分查找代码逻辑
39 int BinarySearch(int *a,int nLen,int nNumberic)//前提是: 该数组已经排序过了
40 {
41 /*
42 *a是数组
43 nLen是数组长度
44 nNumberic是要查找的数据
45
46 return的是下标
47 */
48
49 int low = 0; //起始下标
50 int high = nLen -1; //最后1个下标
51 int mid; //中间下标
52
53 while (low <= high)//当low > high的时候,循环结束,就表示在数组里没有找到nNumberic
54 {
55
56 mid = (low + high) / 2;//整数+整数相除可能有小数,但是默认规则是舍去小数位,依然可以得到小于high的整数索引
57
58 if (a[mid] == nNumberic)
59 {
60 return mid;//找到了nNumberic,返回下标
61 }
62 else if (a[mid] < nNumberic)//nNumberic在下半部分
63 {
64 low = mid + 1;//重新设置查找范围的起始地址
65 }
66 else if (a[mid] > nNumberic)
67 {
68 high = mid - 1;//重新设置查找返回的结束地址
69 }
70
71 //这里的 mid + 1 和 mid - 1 只是重新设置查找范围
72 }
73
74 //如果没有该nNumberic 就返回-1
75 return -1;
76
77 }