算法刷题

二分查找的两种实现方法-【Java版】

二分查找,又叫折半查找。给定一个数据,查看该数据是否在给定的数组中,如果存在,就返回这个数据在数组中的下标位置,如果不存在,则返回-1g需要实现二分查找的前提是:待查找的数组是有序的。二分查找的思路:1:需要有个有序的数组2:需要一个待查询的数据3:先获取的数组的中间下标的值4:拿着中间值和待查询数据进行比较4.1:如果中间值小于待查数据,说明,待查找的数据在中间数据的右侧后半段(因为数组有序的,

二分查找(折半查找)要求待查数组有序,通过比较中间值与目标值不断收缩区间:中间值小于目标则起始位置右移一位,大于则结束位置左移一位,相等返回下标,找不到返回-1。Java实现有while循环和递归两种方案,优点是比较次数少查找快,适用于不常变动而查找频繁的有序列表。

  • 二分查找前提是数组有序,比较次数少、查找速度快、平均性能好
  • while方案用起始和结束双下标,循环条件为startIndex小于等于endIndex
  • 递归方案传入最小最大下标,中间值偏大时结束下标减1,偏小时起始下标加1
  • 缺点是要求有序表且插入删除困难,适合不经常变动而查找频繁的列表

二分查找,又叫折半查找。给定一个数据,查看该数据是否在给定的数组中,如果存在,就返回这个数据在数组中的下标位置,如果不存在,则返回-1

g需要实现二分查找的前提是:待查找的数组是有序的。

二分查找的思路:

1:需要有个有序的数组

2:需要一个待查询的数据

3:先获取的数组的中间下标的值

4:拿着中间值和待查询数据进行比较

4.1:如果中间值小于待查数据,说明,待查找的数据在中间数据的右侧后半段(因为数组有序的,折半后,右边数据大于左边数据),所以,查询的起始位置应该是中间位置+1

4.2:如果中间值大于待查数据,说明,待查数据在中间值的左侧后半段,所以,查找位置的结束点应该是中间值下标-1

4.3:如果中间值等于比较值的话,就直接返回中间值的下标

4.4:否则就返回-1

二分查找示意图:

f4697605980734dfb71fa1086931153b.png

根据以上思路,可以分为两种方案:一种是递归查询的,一种是while查询的。请看代码

一:使用while方案的:


/**
 * 二分查找的真实方法
 * @param array     待查数组
 * @param compartDate   比较的数据
 * @return  比较的数据的下标
 */
public static int biSearchWhileFunction(int [] array,int compartDate){
    //起始位置
    int startIndex = 0;
    int endIndex = array.length-1;
    //中间值的下标为止
    int mIndex;
    while(startIndex <= endIndex){
        mIndex = (startIndex+endIndex)/2;
        //如果中间值== 比较值。则中间值的下表+1
        if(array[mIndex] == compartDate){
            return  mIndex ;
        }else if(array[mIndex]<compartDa

原创不易,完成人机校验,阅读全文

常见问题

二分查找算法的前提条件是什么?

待查找的数组必须是有序的。只有有序才能通过比较中间值判断目标在左半段还是右半段,从而每次把查找范围缩小一半,这也是折半查找名称的由来。

二分查找找不到目标时返回什么?

通常返回-1表示数组中不存在该数据。示例代码在区间越界、目标小于最小值或大于最大值时直接返回-1,测试方法根据-1输出未查询到的提示。

相关推荐