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


    其实这名字有点拗口。

    简单来说就是:

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

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

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

    其实有两种做法:

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

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

    首先来看到的第一种方法

     

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

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

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

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

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

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

    如一个数组: 

     

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

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

  • 相关阅读:
    HDU2303(数论)大整数求余+素数筛选
    2015 多校联赛 ——HDU5360(贪心+优先队列)
    2015 多校联赛 ——HDU5363(快速幂)
    2015 多校联赛 ——HDU5353(构造)
    2015 多校联赛 ——HDU5348(搜索)
    2015 多校联赛 ——HDU5350(huffman)
    hibernate投影查询
    Hibernate中Criteria的完整用法
    mysql 常用查询语句记录
    ssh整合步骤整理
  • 原文地址:https://www.cnblogs.com/menghujava/p/9925793.html
Copyright © 2020-2023  润新知