其实这名字有点拗口。算法
简单来讲就是:数组
一个已知的数组(知道其全部属性),blog
而后在选出数组中的一个元素,索引
再让程序求出这个元素在数组的索引。效率
其实有两种作法:变量
第一种就是最简单的,先把这个数组遍历一遍,一个一个去比较,看看哪一个相等。循环
第二种就是咱们要讲的一个算法:二分法查找遍历
首先来看到的第一种方法程序
其实这个思路就很简单,就是上面说的。方法
先遍历,在去一个一个比较。假如比较到了就赋值索引,而后跳出循环。
这个方法有个缺点就是费时,虽说程序运行中看不出,但是咱们知道这是最没有效率的方法。
而后咱们在看到第二种方法:
二分法,只不过这种方法有个缺点,就是数组必需要是顺序排列的。
这个算法的大概思路是这样的:
如一个数组:
假如咱们要求出这里6的索引,用二分法如何作呢?
在开始以前咱们要知道三个变量:
最小索引:不就是0吗
最大索引:不就是数组长度减去1吗
以及中间索引:不就是最大索引加上最小索引除以2的值吗
好了,有了这三个值接下来就开始比较了。
首先,使用中间索引的值去与findnum也就是要找的数比较。
而后发现中间索引的值大于findnum的值,这时要作一件事就是去更新上面的三个值
既然findnum小于中间索引的值,那么中间索引后面的值均可以去掉。
min = 仍是等于0
max = 等于当前的中间索引
mid = 仍是和上面的公式同样
这时的三个索引变成了这样
而后在去拿中间索引的值和findnum比较。
而后发现这个值就是咱们要找的,而后返回这个中间索引就好了。
其实不止这一种状况,还有大于的状况。
和小于的差很少只不过是min和max这两个东西的更新不同而已
接下来就给出代码:
这里方法最主要的就是如何去更新这三个索引
让咱们看到这个方法:
这三个索引一开始都被定义出来,赋值了
而后while循环,假如中间索引的值不等于findnum就一直循环
不等于就只有两种状况:大于和小于
假如大于的话说明这个数就不在mid和max索引之间
而后就吧mid到max这段去掉,更新max=mid
小于的话状况恰好相反
去掉min到mid这段,更新min = mid
而后每次循环更新一个mid
若是循环条件为false时会跳出循环,
这时表示mid索引的值就会等于findnnum
而后返回这个mid索引就好了
如今有一个问题就是假如数组是降序排列的
那么该怎么作呢?
其实很简单,只须要把if中的大于换成小于
二分法最最重要的一点就是数组要有序排列。