二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
int binarySearch(int *arr, int size, int target)
{
int low = 0;
int high = size - 1;
int mid;
while (low <= high)
{
mid = low + (high - low) / 2;
if (target > arr[mid])
low = mid + 1;
else if (target < arr[mid])
high = mid - 1;
else
return mid; // 查到返回该元素的下标
}
return -1; // 未查到返回-1
}
考察点:
(1)循环条件:“low<=high”能否改为“low<high”;不行。如果改为low<high的话,就有可能出现本来数组中有待查元素,却查不出来的情况。eg:arr[]={1,3,5,7,9,11,13},查找元素9时,最后low和high均指向了元素9,此时循环条件不成立,显示查找不到。
(2)mid的初始化:“mid=low+(high-low)/2”而不用“mid=(low+high)/2”。当low和high数值很大时,low+high就会产生溢出,low+high的结果就会变为负数,程序运行时会出错。
(3)时间复杂度:二分查找最坏时间复杂度Olog2n)。