对二分查找思想的理解

 

前言

在日常生活中,查找的思想很常见。当我们在做查找动作时,首先我们想到的肯定是挨个查找,排除,也就是线性查找。但是如果我们使用二分查找的思想,不断将查找区间折半进行查找,这样的时间复杂度明显低于线性查找。


一、什么是二分查找

 二分查找也叫折半查找,就是在一个有序(升序或者降序)的区间里找一个数,不断对区间进行折半进行查找,查找过程中不断对最大值和最小值进行更新,形成新的区间。直到找到为止。二分查找的查找效率是十分高效的,但是有一点特别需要注意:二分查找的目标序列必须是有序的或者是提前排好序的。若是一个无序序列,则需要先进行排序再进行查找。

概念很笼统,举例说明:

问题:在一个有序数组中找到目标数的下标,如果没有,请显示出来。

分析:一个有序数组中找一值,用二分查找。先计算出数组元素的大小,得到最小值,最大值的下标。然后算出中间值的下标,得到中间值。然后使中间值与目标值进行比较,如果目标值大了,则更新最小值,反之更新最大值,如此反复,直到最大值与最小值相等,即找到目标值。

#include<stdio.h>
int main() {
	int a[] = { 11,22,33,44,55,66,77,88,99,111, };
	int length=sizeof(a)/sizeof(a[0]);    //求数组元素个数
	int i = 0;
	int min = 0;
	int max = length - 1;
	int mid = (min + max) / 2;        //取中间数与目标数进行比较
	scanf("%d", &i);
	while (min<=max) {//注意
		if (a[mid] < i) {
			min = mid + 1; //注意             
			mid = (min + max) / 2;      //更新区间的最大值和最小值
		}
		else if (a[mid]>i) {
			max = mid - 1;//注意
			mid = (min + max) / 2;
		}
		else {
			printf("result is %d\n", mid);
			break;
		}
	}
	if (min > max) {
		printf("not found\n");
	}
	return 0;
}

运用二分查找的思想注意点:

1.确认查找区间元素是有序的。

2.找出区间的最大值与最小值,并且要不断对最值进行更新。

上述代码简单,但是还是有几个需要注意的地方。

1.sizeof()是C语言的一种单目操作符,它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。例如整形(int)在存储空间占4字节,上述函数中sizeof(a)/sizeof(a[0]),用数值表示为40/4=10.

2.循环条件min<=max,是否需要带'='。这里很容易出错。可以这样想当min=max时,即mid=min=max,此时目标数就是中间数的值,即找到了目标数,当min>max时,说明区间中没有找到,所以需要带上'='。

3.min与max更新应该是‘mid+1’或‘mid-1’,应为中间值已经与目标值比较过了,所以不需要比较了。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值