求出数组中任意一个元素的索引值

其实这名字有点拗口。算法

简单来讲就是:数组

一个已知的数组(知道其全部属性),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中的大于换成小于

 

二分法最最重要的一点就是数组要有序排列。

相关文章
相关标签/搜索