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)

  • 相关阅读:
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
    设计模式-单例
    java集合-补充HashMapJDK1.8
    java多线程-线程池
    java-阻塞队列
    java多线程-信号量
    java多线程-读写锁
    java多线程-锁
    Ubuntu下编译Poco库
  • 原文地址:https://www.cnblogs.com/Ponytai1/p/5869819.html
Copyright © 2011-2022 走看看