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

其实这名字有点拗口。

简单来说就是:

一个已知的数组(知道其所有属性),

然后在选出数组中的一个元素,

再让程序求出这个元素在数组的索引。

其实有两种做法:

第一种就是最简单的,先把这个数组遍历一遍,一个一个去比较,看看哪个相等。

第二种就是我们要讲的一个算法:二分法查找

首先来看到的第一种方法

 

其实这个思路就很简单,就是上面说的。

先遍历,在去一个一个比较。假如比较到了就赋值索引,然后跳出循环。

这个方法有个缺点就是费时,虽然说程序运行中看不出,可是我们知道这是最没有效率的方法。

然后我们在看到第二种方法:

二分法,只不过这种方法有个缺点,就是数组必须要是顺序排列的。

这个算法的大概思路是这样的:

如一个数组: 

 

假如我们要求出这里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中的大于换成小于

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

原文地址:https://www.cnblogs.com/menghujava/p/9925793.html