二分查找
作者:互联网
二分查找使用时的前提条件:
-
查找的内容在逻辑上是有序的。
-
查找的数量只能是一个。
二分法的思想:
-
选择数组中间的数字与目标值进行比较。
-
如果相等,返回答案。
-
如果不相等
-
中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,右边的数字全部排除
-
中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,左边的数字全部排除
-
抛去一个错误观念:
当数组长度是偶数时,怎么取最中间的数。千万不要纠结这个问题,这并不影响我们寻找目标数。
记住判断的核心思想:
-
只要取的数字大于目标数字,就排除右边
-
只要取得数字小于目标数字,就排除左边
所以数组长度是偶数时,并不一定要取最中间的数,这并不影响怎么排除的问题,无非就是多排除一个数字或者少排除一个数字。
真正影响结果的时,取的哪个中间数字要不要加入下一次判断的查找中,即边界值问题。
边界值问题:
-
左闭右闭区间
-
左闭右开区间
判断过程中,最重要的两个点:
-
while循环中 left 与 right 的关系,到底是 left <= right 还是 left < right
-
迭代过程中 middle 和 right 的关系,到底是 right = middle - 1 还是 right = middle
左闭右闭区间的情况:
public static void main(String[] args) { int[] nums = new int[]{-1, 0, 3, 9, 11, 13, 22, 27, 33, 57, 66, 77}; //nums是数组,size是数组的大小,target是需要查找的值 int search = new BinarySearch1().search(nums, nums.length, 33); System.out.println(search); } int search(int nums[], int size, int target) { int left = 0; int right = size - 1; // 定义了target在左闭右闭的区间内,[left, right] while (left <= right) { //当left == right时,区间[left, right]仍然有效 int middle = left + ((right - left) / 2);//等同于 (left + right) / 2,防止溢出 if (nums[middle] > target) { right = middle - 1; //target在左区间,所以[left, middle - 1] } else if (nums[middle] < target) { left = middle + 1; //target在右区间,所以[middle + 1, right] } else { return middle; //既不在左边,也不在右边,那就是找到答案了 } } //没有找到目标值 return -1; }
左闭右开区间的情况:
public static void main(String[] args) { int[] nums = new int[]{-1, 0, 3, 9, 11, 13, 22, 27, 33, 57, 66, 77}; //nums是数组,size是数组的大小,target是需要查找的值 int i = new BinarySearch1().search1(nums, nums.length, 27); System.out.println(i); } int search1(int nums[], int size, int target) { int left = 0; int right = size; //定义target在左闭右开的区间里,即[left, right) while (left < right) { //因为left = right的时候,在[left, right)区间上无意义 int middle = left + ((right - left) / 2); if (nums[middle] > target) { right = middle; //target 在左区间,在[left, middle)中 } else if (nums[middle] < target) { left = middle + 1; } else { return middle; } } // 没找到就返回-1 return -1; }
标签:二分,right,target,nums,int,middle,查找,left 来源: https://www.cnblogs.com/l12138h/p/16263541.html