二分查找

二分查找又称折半查找法,是一种重要的查找算法。它的主要的应用是从一个给定的序列中查找指定的元素,二分查找的原理比较简单此处不再赘述。

从实现的角度看,有递归方法和非递归方法。

下面分别给出二分查找的递归实现和非递归实现方法:

递归实现:

 1     static boolean binarySearch(int target, int[] list, int low, int high) {
 2         if (low > high)
 3             return false;
 4         else {
 5             int mid = low + ((high - low) >> 1);
 6             if (list[mid] > target)
 7                 return binarySearch(target, list, low, mid - 1);
 8             else if (list[mid] < target)
 9                 return binarySearch(target, list, mid + 1, high);
10             else
11                 return true;
12         }
13   }

注意第2行是low>high而不是low>=high, 这是边界条件

非递归实现:

 1     static boolean binarySearch(int target, int[] list) {
 2         int left = 0;
 3         int right = list.length - 1;
 4         while (left <= right) {
 5             int mid = left + ((right - left) >> 1);
 6             if (list[mid] == target) {
 7                 return true;
 8             } else if (list[mid] > target) {
 9                 right = mid - 1;
10             } else if (list[mid] < target) {
11                 left = mid + 1;
12             }
13         }
14         return false;
15     }

这里面容易出错的地方有:

1. 代码第4行的判断条件是left<=right, 如果写成left<right, 则将造成要查找的数如果是序列的最后一个查找不成功,如从1,2,3,4中查找4;

2.代码第5行,通过位移计算中点的方法

TALK IS CHEAP, SHOW ME THE CODE
原文地址:https://www.cnblogs.com/greatLong/p/10539954.html