二分查找又称折半查找法,是一种重要的查找算法。它的主要的应用是从一个给定的序列中查找指定的元素,二分查找的原理比较简单此处不再赘述。
从实现的角度看,有递归方法和非递归方法。
下面分别给出二分查找的递归实现和非递归实现方法:
递归实现:
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行,通过位移计算中点的方法;