首页 > 代码库 > 分治法(二分查找)

分治法(二分查找)

给出有序排列的一组数组求出指定元素的下标。

 

一开始纠结数组奇偶个数,能否查询到首尾。稍加分析后可以发现并不会收到这些因素干扰。

 1 // 二分找出其中指定关键字的下标 1,3,5,7,9,13,15,17 2  3  4  5 #include <stdio.h> 6 #include <stdbool.h> 7  8 /****** 递归实现*******  9 int Findmax(int keyNum,const int box[],int size,int left,int right)       //传入参数为(关键字,数组,数组大小,左界,右界10 {11     int mid = (left + right) / 2;                                         12     if(box[mid] == keyNum)                                             //如果中间值 为关键字则直接输出13     {14         return mid;15     }16     else17     {18         19         if(box[mid] > keyNum)                                          //如果中间值大于关键字,将右界改为mid -1 即搜索左半20         {21             return Findmax(keyNum,box,size,left,mid - 1);22         }else23         if(box[mid] < keyNum)24         {25             return Findmax(keyNum,box,size,mid + 1,right);            //如果中间值小于关键字,将左界改为mid +1 即搜索右半26         }27     }28 }29     30     31     32 // **************以下循环实现 33 int main ()34 {35     int box[9] = {1,3,5,7,9,11,13,15,17};36     int keyNum = 13;37 38     int left = 0;39     int right = 8;40     int mid;41     while(true)42     {43         mid = (left + right) / 2;    //*****此处可以注意优化          44         if(box[mid] == keyNum)45         {46             break;47         }else48         if(box[mid] > keyNum)49         {50             right = mid - 1;51         }else52         left = mid + 1;53     }54     return 0 ; 55 }

     注意点在于   mid = (left + right) / 2 可能导致溢出,应该使用 mid = (right - left) / 2 + left 。

分治法(二分查找)