赞
踩
用于在有序数组中查找的算法,优势是能降低时间复杂度。
时间复杂度的讨论:
线性搜索在最坏的情况要比较n次,而二分搜索大概需要log2N次。由于二分搜索,每进行一次比较,搜索范围就会减半,所以降低了复杂度,二分搜索的复杂度为logN。
(大部分教材log2N都直接表示为 logN)
元素n n=100 线性搜索 100次 二分搜索 7次
n=10000 线性搜索 10000次 二分搜索 14次 2^14 大致等于 10000
二分搜索只能使用在有序的数组(因为会根据当前数据元素的中间值来逐渐确定目标元素的位置)。
步骤为:1.先与中间值比较,如果相等就退出。
2.如果不符合就判读大于还是小于中间值然后缩短搜索范围。
(数组为升序,如果target大于middle这个中间值,我们就把下次搜索范围缩短到
[middle+1,right] )
此时的left = middle+1 (关于left = middle+1 和 middle =(left + right +1)/2 涉及到该二分查找是
否会死循环和是向下取整还是向上取整)
middle = (right + left)/2 (更新当前中间元素的值)
3.重复执行以上步骤,直到 left>right 或者 找到了目标值。
关于死循环:
例如 left = 3 ,right =4 如果 middle = (left + right )/2
left=middle 就会进入死循环,原因是(3+4)/2 =3
left > right 的情况是没有找到目标值
是已经把数组搜索范围划分到最小的情况(即left,middle,right它们的下标是相邻的三个),再执行
right = middle
middle = (left + right)/2
middle = left
仍然没有找到的话就会让 left > right,然后结束查找。
代码如下:
运行:
初始化以及调用
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。