分治法(二分查找)

Posted Ponytai1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分治法(二分查找)相关的知识,希望对你有一定的参考价值。

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

 

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

 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     else
17     {
18         
19         if(box[mid] > keyNum)                                          //如果中间值大于关键字,将右界改为mid -1 即搜索左半
20         {
21             return Findmax(keyNum,box,size,left,mid - 1);
22         }else
23         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         }else
48         if(box[mid] > keyNum)
49         {
50             right = mid - 1;
51         }else
52         left = mid + 1;
53     }
54     return 0 ; 
55 }

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

以上是关于分治法(二分查找)的主要内容,如果未能解决你的问题,请参考以下文章

分治法(二分查找)

分治法——二分查找

分治法应用之二分查找 快速排序递归排序

分治法之二分查找

算法导论第2章 分治法与归并排序, 二分查找法

二分查找算法