对二分查找思想的理解
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’,应为中间值已经与目标值比较过了,所以不需要比较了。
以上是关于对二分查找思想的理解的主要内容,如果未能解决你的问题,请参考以下文章