一. 二分查找基本思路
在有序表中,每次都取中间元素作为比较的对象。
如果给中间值与给定值相等,则查找成功,返回该元素的下标/索引;
如果中间值大于给定值,则在中间值的右半区间继续查找;
如果中间值小于给定值,则在中间值的左半区间继续查找;
确定了该元素所在范围那么范围外的元素就不需要查找了,不断重复上诉过程,直至找到
因为二分查找每次查找都可以剔除一半的查找范围,所以相比顺序查找每次一个一个元素查找,查找效率提高了很多。
二分查找需要两个必要条件:
1.数组元素必须有序
2.查找的数值不能多个,只能一个
二. 详细图解
例如:给定一个有序数组 nums = {1,2,4,5,7,8,11,15} 中,求数字7所在数组中的下标
二分查找过程:
(1)定义两个指针 left 和 right ;left 指向首元素的下标,right 指向最后一个元素的下标。 traget 为目标值。即:
(2)求中间元素的值mid,即:mid = left + (right - left) / 2 得到中间下标 通过中间下标可以访问到中间元素 nusm[mid] 。即:
问题:求中间值为什么不用 mid = (left + right) / 2 呢?
原因:如果是两个较大的值,相加超过了 int 取值范围(2147483647)就会导致溢出
(3)使用中间值 nums[mid] 和目标值 target 对比,此时 nums[mid] < target 就证明 nums[mid] 左边的值 和 nums[mid]的值都不需要继续对比了。然后将 l