算法系列二:二分查找
一、原理
二分查找 一定是在 有序数组里 进行的(我们这里讲升序情况),定义左右指针 指向要查找数据当前能确定的 可能在数组里的 下标范围两端,每一次查找时 查找范围中间的对象数据,即(left + right)/2 下标位置的数据
left+right 可能和是奇数,(left + right)/2 对应的下标不在当前范围正中间的位置(正中间的后一个位置),但并不影响二分,依旧是将数组跨分为两部分、每次划掉另一部分 近范围一半的数据 查找,只是划分时 能在当前能确定范围正中间位置查找并划掉部分 最好,按顺序遍历查找 其实每次能砍掉的确定范围大小 是一个元素的量,而二分查找 每次查找能砍掉的确定范围大小 是当前范围一半元素的量,所以查找的效率是更加优秀的
二、查找过程
每一次取到范围中间的元素数据 进行比较,如果目标数据大于中间元素数据,说明目标数据 是在划分部分的右半部分(不包含当前拿来比较的中间元素),left左指针 移到当前拿来比较的中间元素右边一位,即lefty= 移到mid+1位置,现在能确定的 目标数据所在的范围 就划掉一半了,在[mid+1,right]范围之内,接着在新的这个范围内 重新进行下一次相同过程的查找,如果中间位置数据还不是,就继续砍一半范围,再在新的范围内再查找,从一开始的 整个数组范围内查找,到后面新的 很小的范围内 查找,直到找到为止 或left<right时 说明目标数据在数组里没有 为止,找到时返回目标数据的索引,没有找到就返回-1
三、方法实现