二分查找
使用场景
- 有序数组,查找固定值。
- 查找一个值。
算法思路
- 首先设数组首部(left)和尾部(right),以及中间位(middle).
- 设置目标值(target).
- 用中间位与目标值相比较,如果中间值大于目标值,说明包括中间值以及中间值右边的所有数值都大于目标值(注意是有序数组),这时可以把尾部挪到中间值的前一个数值上。
- 如果中间值小于目标值,说明包括中间值在内以及中间值左边的值都小于目标值,这时就把首部挪到中间值往右一位的地方。
- 接着思考中间位,中间位在首地址不动时,不用加上首地址的地址。当首地址往前挪动的时候,尾部减去首部会变成一个很小的数字(小于首部),所以要注意加上首部,才可以把中间位加到真确的位置。
- 思考循环:当left < = right 时可以结束循环,注意当left 等于 right 时,指向的是一个数字,这个数字可以是目标值。但当这个值大于目标值的时候,尾部就要向前移动一位(right–);如果这个值小于目标值的时候,首部就要向前移动一位(left);所以当要把目标值插入到合适的位置时只要返回left的值就可以了,left的值正好是目标值的合适位置。
代码实现
int search(int *array, int len, int target)
{
int left = 0;
int right = len - 1;
while(left <= right)
{
int middle = left + (right - left) / 2;
if(array[middle] == target)
return middle;
if(array[middle] > target)
right = middle - 1;
else
left = middle + 1;
}
return -1;
}