二分查找算法

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

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

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

二分查找法的基本实现

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

/*
* 递归实现
*/ 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)。因而导致构建有序数组变成低效的事情。

原文地址:https://www.cnblogs.com/cherish010/p/9765615.html