zoukankan      html  css  js  c++  java
  • 分治法(二分查找)

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

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

     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 。

      时间复杂度 O(logn)

  • 相关阅读:
    Java1.7的HashMap源码分析-面试必备技能
    Springboot集成Swagger2
    springsecurity简单学习
    Java8的新特性
    HttpClient
    Filter的使用
    Spring拦截器和SpringAop实现
    运维工程师打怪升级进阶之路 V2.0
    欢迎加入微信交流群交流
    赞!7000 字学习笔记,一天搞定 MySQL
  • 原文地址:https://www.cnblogs.com/Ponytai1/p/5869819.html
Copyright © 2011-2022 走看看