对二分查找思想的理解

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对二分查找思想的理解相关的知识,希望对你有一定的参考价值。

 

前言

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


一、什么是二分查找

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

概念很笼统,举例说明:

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

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

#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’,应为中间值已经与目标值比较过了,所以不需要比较了。

以上是关于对二分查找思想的理解的主要内容,如果未能解决你的问题,请参考以下文章

对二分法的理解以及结对编程情况

对二分法的理解和结对编程情况

理解二分查找问题中的范围问题

对二分法思想的体会及结对编程情况汇报

二分查找无废话版总结

浅谈对二分思想的理解