二分查找算法

Posted cherish010

tags:

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

二分查找算法主要是解决在“一堆数中找出指定的数”这类问题。

而想要应用二分查找法,这“一堆数”必须有一下特征:

  • 存储在数组中
  • 有序排列

二分查找法的基本实现

二分查找法在算法家族大类中属于“分治法”,分治法基本都可以用递归来实现的,二分查找法的递归实现如下:

/*
* 递归实现
*/ private static boolean divideRecur(int[] aa, int left, int right, int tt) {   if(left > right) {     return false;   }   int mid = left + ((right - left)>>1);//防止溢出   if(tt == aa[mid]) {     return true;   }else if(tt < aa[mid]) {     return divideRecur(aa, left, mid -1, tt);   }else {     return divideRecur(aa, mid +1, right, tt);   } }

迭代实现如下:

/*
* 迭代实现
*/
private static boolean divideTest(int[] aa, int tt) {
	
  int size = aa.length;
  int left =0;
  int right  = size -1;
  int midIndex = 0;
  int midValue = 0;
  while(left <= right) {
    midIndex = left +((right - left)>> 1);
    midValue = aa[midIndex];
    if(tt==midValue) {
      return true;
    }else if(tt<midValue) {
      right = midIndex -1;
    }else {
      left = midIndex + 1 ;
    }
  }
  return false;
}

 

二分查找法的O(log n)让它成为十分高效的算法。不过它的缺陷却也是那么明显的。就在它的限定之上:

有序,我们很难保证我们的数组都是有序的。当然可以在构建数组的时候进行排序,可是又落到了第二个瓶颈上:它必须是数组

数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n)。因而导致构建有序数组变成低效的事情。



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

python算法:二分查找

java 二分查找法

二分查找算法讲解及其C++代码实现

leetcode查找算法(顺序查找,二分法,斐波那契查找,插值查找,分块查找)

二分查找算法

python算法之二分查找