zoukankan      html  css  js  c++  java
  • 二分查找 Binaryserach

       二分查找:

       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

         //考虑边界条件

     1 //[]闭区间
     2 int Binaryserach(int *array, int size, int key)
     3 {
     4     assert(array != NULL);
     5     int left = 0;
     6     int right = size - 1;
     7     while (left <= right)
     8     {
     9         int mid =( (right - left) >>1) + left;
    10         if (array[mid] > key)
    11         {
    12             right = mid - 1;
    13         }
    14         else if (array[mid] < key)
    15         {
    16             left = mid + 1;
    17         }
    18         else
    19         {
    20             return mid;
    21         }
    22     }
    23     return -1;
    24 }
     1 //[)半开半闭区间
     2 int Binaryserach(int *array, int size, int key)
     3 {
     4         assert(array != NULL);
     5         int left = 0;
     6         int right = size;
     7         while (left < right)
     8         {
     9             int mid =( (right - left) >>1) + left;
    10             if (array[mid] > key)
    11             {
    12                 right = mid ;
    13             }
    14             else if (array[mid] < key)
    15             {
    16                 left = mid + 1;
    17             }
    18             else
    19             {
    20                 return mid;
    21             }
    22         }
    23         return -1;
    24 }

       /*递归实现(递归算法解题通常显得比较简洁,但递归算法解题的运行效率较低;
    在递归调用的过程中系统为一层返回点、局部变量开辟了栈来存储,空间复杂度增大。一般情况下不建议用递归算法设计程序)*/

     1 int Binaryserach(int *array, int left,int right,int key)
     2 {
     3     assert(array != NULL);
     4     if (left <= right)
     5     {
     6         int mid = ((right - left) >> 1) + left;
     7         if (array[mid] == key)
     8         {
     9             return mid;
    10         }
    11         if (array[mid] > key)
    12         {
    13             return Binaryserach(array, left, mid - 1, key);
    14         }
    15         else
    16         {
    17             return Binaryserach(array, mid + 1, right, key);
    18         }
    19     }
    20     else 
    21         return -1;
    22 }
  • 相关阅读:
    java如何将char类型的数字转换成int型的数字,而不是Ascii
    java 二分查找的注意事项
    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
    java中Math的常用方法整理
    判断字符串是否可由重复子字符串组成
    P3558 [POI2013]BAJ-Bytecomputer
    BZOJ 3329. Xorequ
    Codeforces 1221F. Choose a Square
    Codeforces 1221E. Game With String
    Codeforces 1221D. Make The Fence Great Again
  • 原文地址:https://www.cnblogs.com/-zyj/p/5499576.html
Copyright © 2011-2022 走看看