coding第2天

coding第二天

折半查找函数,在数组v[]中查找值x;数组长度为n,返回值是数组的下标。
先从程序中分析,第一印象为当数组长度分别为奇数和偶数的时候,是否程序都能正确执行。

1
2
3
4
5
6
7
8
9

首先,如上图,假设数组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;
}
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页