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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来根华子冷静下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值