码迷,mamicode.com
首页 > 其他好文 > 详细

分治法(二分查找)

时间:2016-09-13 22:15:44      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

 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 。

分治法(二分查找)

标签:

原文地址:http://www.cnblogs.com/Ponytai1/p/5869819.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!