算法系列之七 二分查找

Posted rk的成长呓语

tags:

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

二分查找是一个较为简单的算法。用于在排好序的序列中进行查找。二分查找是典型的“分治算法”,其复杂度是 O(log n)


虽然说算法简单,但是很多人都不能无任何参考的情况下,写出来。所以,还是有必要理解记忆一下算法的细节。


二分查找的中心思想是:


    1. 将序列分为两个子序列

    2. 找到序列中的中间元素比较

    3. 如果大于中间元素,则将 右边子序列当做原始序列,从 第一步开始重复

    4. 如果大于中间元素,则将 左边子序列当做原始序列,从 第一步开始重复

    5. 如果相等,结束算法    


二分查找可以使用递归实现,但因为是 尾递归,也可以转为循环实现。


使用循环的实现方法

int binary_search(int v, const int *a, int lo, int hi) {    

   while (lo <= hi) {        
       int mid = (lo + hi) >> 1;        
       
       if (v < a[mid]) hi = mid - 1;        
       
       else if (v > a[mid]) lo = mid + 1;        
       else return mid;    }    
       
   return -1; }


使用递归的实现方法

int binary_search_recursion(int v, const int *a, int lo, int hi) {
   if (lo > hi)  // 递归退出条件,重要        return -1;    
   
   int mid = (lo + hi) >> 1;    
   
   if (v < a[mid])        
       return binary_search_recursion(v, a, lo, mid - 1);
   
   else if (v > a[mid])        
       return binary_search_recursion(v, a, mid+1, hi);    
       
   else        return mid; }



以上是关于算法系列之七 二分查找的主要内容,如果未能解决你的问题,请参考以下文章

算法学习系列 -- 二分查找

算法笔记系列:二分查找

经典算法系列之:二分查找

经典算法系列之:二分查找

算法系列二分查找的“变形记”

基础算法系列之排序算法[快速排序,归并排序,二分查找]