一、简要介绍二分查找算法
二分查找算法(Binary Search)是一种非常经典且有用的查找算法,它适用于有序数组的元素查找,并且思路简单,能够用非常简洁的代码来将其实现,经典版本的二分查找算法最优情况下的时间复杂度为O(1),最坏情况下的复杂度为O(lgN),平均时间复杂度也仅为O(lgN)。
在时间复杂度上更加优秀的算法不是太多,如hash table通过空间换时间的得到O(1)的时间复杂度,以及在二分法思想上进行改进的插值查找算法得到的O(lg(lgN))的时间复杂度(对数据的分布有一定的要求,不够稳定)。
二、二分查找算法的实现
2.1二分法的算法思想
1)若数组不为空(beg < end),获取位于数组中间的元素(mid),如果中间元素正好是要查找的元素,则搜索过程结束,否则进入下一步;
2)判断关键值是否大于还是小于中间元素,以中间元素为界,若关键值小于vec[mid],则进入前半段[beg,mid),否则进入后半段[mid+1, end)。
3)若数组为空,则数组中不存在等于该关键字的元素,返回-1,意味着不存在这样的下标。
2.2版本A
版本A时二分法算法思想的直接体现。在实现时,需要注意避免溢出的风险
int mid = (beg + end) >> 1//规避溢出风险并且理论上移位比除法快一些(写/2也没关系,编译器会帮你做出优化的)