二分查找算法java实现


前言


提示:以下是本篇文章正文内容,仅供参考

一、二分查找思路

二分查找只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找

二分查找法的运行时间为对数时间O(log2 n),即查找到需要的目标位置最多只需要log2 n步,假设从0~99的数列中(n=100)中寻找目标数30,则只需要查找步数log2 100,最多查找7次

二分查找的思路(递归):

  • 1、首先确定该数组的中间的下标
  • mid = (left + right) / 2
  • 2、然后让需要查找的数findVal和arr[mid]比较
  • 2.1 findVal > arr[mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找
  • 2.2 findVal < arr[mid] ,说明你要查找的数在mid的左边,因此需要递归的向左查找
  • 2.3 findVal = arr[mid] ,说明找到,就返回

  • 什么时候结束递归?
    • 找到就结束递归
    • 递归完整个数组,仍然没有找到findVal,也需要结束递归,即当left > right 就需要退出递归

二、代码实现

1.递归实现

代码如下(示例):

package com.yang;

/**
 * 二分查找非递归
 *
 * 二分查找只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找
 * 二分查找法的运行时间为对数时间O(log2 n),即查找到需要的目标位置最多只需要log2 n步,假设从0~99的数列中(n=100)中寻找目标数30,则只需要查找步数log2 100,最多查找7次
 *
 * 二分查找的思路:
 * 1、首先确定该数组的中间的下标
 * mid = (left + right) / 2
 * 2、然后让需要查找的数findVal和arr[mid]比较
 *  2.1 findVal > arr[mid] ,说明你要查找的数在mid的右边,因此需要递归的向右查找
 *  2.2 findVal < arr[mid] ,说明你要查找的数在mid的左边,因此需要递归的向左查找
 *  2.3 findVal = arr[mid] ,说明找到,就返回
 *
 *  什么时候结束递归?
 *  1) 找到就结束递归
 *  2) 递归完整个数组,仍然没有找到findVal,也需要结束递归,即当left > right 就需要退出递归
 *
 * @Author: tututuyang
 * @Date: 2021/6/28 12:41
 * @Description:
 */
public class BinarySearch {

    public static void main(String[] args) {
        int[] arr = {1,4,6,9,10,15,20};
        int findVal = 9;
        System.out.println(binarySearch(arr, 0, arr.length, findVal));
        System.out.println(binarySearchNoRecur(arr, findVal));
    }

    /**
     * @param arr 数组
     * @param left 左边的索引
     * @param right 右边的索引
     * @param findVal 目标数
     * @return 如果找到就返回下标,没找到就返回-1
     */
    public static int binarySearch(int[] arr, int left, int right, int findVal) {

        if (left > right) {
            return -1;
        }
        int mid = (left + right) / 2;

        if (arr[mid] == findVal) {
            return mid;
        } else if (arr[mid] > findVal) {
            // 向左边查找
            return binarySearch(arr, left, mid - 1, findVal);
        } else {
            // 向右边查找
            return binarySearch(arr, mid + 1, right, findVal);
        }
    }

    
}

2.非递归实现

代码如下(示例):

/**
     *
     * @param arr
     * @param findVal
     * @return
     */
    public static int binarySearchNoRecur(int[] arr, int findVal) {

        int left = 0;
        int right = arr.length - left;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (arr[mid] == findVal) {
                return mid;
            } else if (arr[mid] > findVal) {
                // 向左边查找
                right = mid - 1;
            } else {
                // 向右边查找
                left = mid + 1;
            }
        }
        return -1;
    }

总结

以上就是今天要记录的内容

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值