二分查找原理和递归和循环代码实现

原理:对有序的数据定一个开始查找的初始位置,一个结束位置,在取他们的中间数,然后拿需要查找的数和这个中间数比较,在根据比较结果在划定查找初始位置,或者结束位置,在重新计算中间数,知道查找位置等于结束位置还没出现需要查找的数,那就说明数据集合中没有要查找的数。

比如一个数组有1到9

1 2 3 4 5 6 7 8 9
查找8。

查找的初始位置是1下标就是[0],结束位置是9,下标是[8],中间数就是([0]+[8])/ 2 = [4],下标是[4],也就是5

先拿8和中间数5比较,如果比5大,就可以排除掉小于5的所有情况,于是可以把查找的初始位置划分到5前面一个元素,也就是下标[4+1] = [5],数是6的位置。

这样就成了,
6 7 8 9
中查找是否存在8,查找初始位置是[5],结束位置是[9],中间数就是([5]+[8])/ 2 = [6],也就是7

然后8和7比还是更大,这样就要继续往后划分,查找初始就划分到就划分到[7+1] = [7],那么就正好是8。那就查找到了,这组数据中有8。

循环实现

// math数据集合,size数组大小,data要查询是否存在的数据
int binary_Search(int math[], int size, int data) {
	int up = 0;
	int down = size-1;
	int centre = 0;

	while (up <= down)
	{
		centre = (up + down) / 2;

		if (data > math[centre]) {
			up = centre + 1;

		}else if (data < math[centre]) {
			down = centre - 1;
		}
		else {
			return centre;
		}
	}

	return -1;
}

递归实现

// math数据集合,up查找的开始,down查找的边界,data需要查找的数据
int binary_Search_2(int math[], int up, int down, int data) {

	if (up >= down) {
		return -1;
	}

	int centre = (up + down) / 2;

	if (data > math[centre]) {
		return binary_Search_2(math, centre + 1,down, data);
	}
	else if (data < math[centre]) {
		return binary_Search_2(math, up, centre - 1, data);
	}
	else {
		return centre;
	}

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值