coding第二天
折半查找函数,在数组v[]中查找值x;数组长度为n,返回值是数组的下标。
先从程序中分析,第一印象为当数组长度分别为奇数和偶数的时候,是否程序都能正确执行。
首先,如上图,假设数组v[]如上图,n=9;x=2;
第一遍循环的时候。low=0,指向1,high=8,指向9;mid=4,指向5;此时x=2小于v[mid];于是更新high=3;
第二遍循环,low=0;指向1,high=3,指向4;mid=1指向2;此时x=2等于v[mid];返回mid值1;结束运行。
其次,假设x=8;
第一遍循环,low=0,指向1,high=8,指向9;mid=4,指向5;此时x=8大于v[mid];于是更新low=5;
第二遍循环,low=5;指向6,high=8,指向9;mid=6指向7;此时x=8大于v[mid];更新low=7。
第三遍循环,low=7;指向8,high=8,指向9;mid=7指向8;此时x=8等于v[mid];返回mid值7,结束运行。
分析可知,(1)mid可以遍历到数组中的任何一个值。能遍历到每一个数的想法是,当数组为奇数个时,mid为中间的值,当只有一个值的时候mid就为该值;当组数为偶数个时候,mid为对半向下取整的值。
(2)因为判定的逻辑条件是high=mid-1与low=mid+1;所以不会漏值。
//
int binsearch(int x,int v[],int n)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(x<s[mid])
{
high=mid-1;
}
else if(x>s[mid])
{
low=mid+1;
}
else
return mid;
}
return -1;
}