折半法查找(二分法查找)

目录

算法的基本思想

 代码表示

当数组是升序排序时

当数组是降序排序时

后记


算法的基本思想

已知条件:

  • 一个有序数组,名为nums
  • 一个变量,名为target

目的:

  • 在nums中找target

算法思想:

  • 所谓折半,就是每次访问数组的中间那一个元素。如果把数组拟作一条线段,则每次访问的就是线段的中间点。

  •  将中间点记作nums[mid],那么在一次比较中,中间点和target之间有且仅有这三种关系:
    • nums[mid] > target
    • nums[mid] = target
    • nums[mid] < target
  • 如果是nums[mid] = target这种关系,那么非常令人欣喜,此时只要返回mid的值便可以。那么若是遇到其他两种情况该如何处理呢。
  • 如果是在数组升序排序的情况下遇到nums[mid] > target:

  •  如果在数组升序的情况下遇到nums[mid] < target:

  •  通过上面的分析,可以归纳出一些有用的信息:

 代码表示

当数组是升序排序时

//class1.java
public class class1{
     public static int half_search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] > target) {
                right = mid - 1;
                continue;
            }
            if (nums[mid] < target) {
                left = mid + 1;
                continue;
            }
        }
        return -1;
    }
}

当数组是降序排序时

//class1.java
public class class1{
    public static int half_search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return mid;
            }
            if (nums[mid] < target) {
                right = mid - 1;
                continue;
            }
            if (nums[mid] > target) {
                left = mid + 1;
                continue;
            }
        }
        return -1;
    }
}

后记

在上面的分析中,只给出了数组升序排序时的情况,并没有给出数组降序排序时的情况,读者可以根据算法的原理自行对数组降序排序的情况进行分析。

总的来说,在中间值和target不相等的情况的处理中,升序排序的数组和降序排序的数组的处理方式恰好相反。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值