2021-07-15

二分法查找


前言

提示:该文旨在帮助自己理解二分法过程。

一、二分法的目的

需求:
从一组有序的数字中找出某个元素。
想法----------利用循环从第一个元素开始试,直到找出来这个数或者没有找到循环结束。
缺点:循环次数多,耗时长,
因此选择算法:
当数据量很大适宜采用该方法。采用二分法查找时,注意:数据需是排好序的。

二、二分法的细节点

1.基本思想

假设数据是按升序排序的,对于给定数据a,从序列的中间位置开始比较,
(1):如果当前位置值等于a,则查找成功;
(2):若a小于当前位置值,则在数列的前半段中查找,即从中间值往前找;
(3):若a大于当前位置值,则在数列的后半段中查找,即从中间值往后找;
(4):找到最后一个数和给定的数据不相等,则该数组中没有我们要找的值;

算法的时间复杂度:O(log(n)) 。

2.思路

举例说明:
1、给定一组有序数字:1,2,3,4,5,6,7,8,9,10。给定数值 7。
(1):确定中间数:5或者6;
(2):使用中间数5和要查找的数7作比较,中间数5小于要找的数7,确定数字在6,7,8,9,10中;
(3):然后用相同的方法,确定中间数为8,使用数字7 和8 进行比较,中间数8大于要找的数7,下一次在6,7中查找;
(4):选择6,7的中间数6或者7,和7 进行比较,,最终确定7的位置。

	//确定数组即左右位置的下标
	int array[10] = {1,2,3,4,5,6,7,8,9,10};
	int left = 0;
	int right = 9;

2、确定中间元素并进行范围查找

//找到中间元素下标
int mid = (left+right)/2;
//中间元素和要找的值进行比较
if(a[mid] > 7 ) {
	//中间元素大于被查找数,范围缩小到前半部分,右位置下标挪到中间元素的前一个位置
	right = mid - 1;
} else if(a[mid] < 7) {
	//中间元素小于被查找数,范围缩小到后半部分,左位置下标挪到中间元素的后一个位置
	left = mid + 1} else {
	//中间元素和被查找数相等。
	printf("index = %d\n", mid);
}

3、当不能一次找到时,需要进行多次循环

//不使用函数,只剖析过程
while(left <= right)
{
	int mid = (left + right) / 2;
	if(7 < a[mid]) {
		right = mid - 1;	
	} else if(7 > a[mid]) {
		left = mid + 1;
	} else {
		printf("index = %d\n", mid);
		break;	
	}
}

if (left > right)
	{
		printf("该数组中不存在这个数\n");
	}
	return 0;

细节点

1:需要理解循环查找的限制条件,即左右范围。 2:注意中间值的选择, 3:熟记时间复杂度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值