一,原理
不会查找数列的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少。 所以二分查找的 时间复杂度 为 O (log 2 n)。
二,适用条件
二分查找要求数列本身有序,所以在选择的时候需要确认数列是否本身有序,如果无序,则还需要进行排序,
三,实现思路
-
初始状态下,将整个序列作为搜索区域(假设为 [left , right]);
-
找到搜索区域内的中间元素(假设所在位置为 a[mid]),和目标元素进行比对。 如果相等,则搜索成功;如果中间元素大于目标元素,表明目标元素位于中间元素的左侧,将 [left , right-1] 作为新的搜素区域;反之,若中间元素小于目标元素,表明目标元素位于中间元素的右侧,将 [left + 1 , right] 作为新的搜素区域;
-
重复执行第二步,直至找到目标元素。 如果搜索区域无法再缩小,且区域内不包含任何元素,表明整个序列中没有目标元素,查找失败。
四,代码的实现
截的长图:
五,问题
1,把sz放到函数里面求会怎样
原因:
在main函数中,int ret = binary_search(arr, key)
这里的arr传参,实际传递的不是数组本身,而是数组首元素的地址,所以在binary_search函数中sz算出来应该是1,所以出错了。
传入地址,其实应该写成指针int binary_search(int* a , int k)
。所以那里的int a[]
本质上就应该是指针,指针求不出元素个数。
所以不能把元素个数放到里面求。
注意:如果函数内部需要参数部分传入一个元素数组的个数,一定是在外面求好元素的个数,作为参数传入进去。