5.二分查找 = 折半查找

 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 }
原文地址:https://www.cnblogs.com/Froger/p/6811875.html