Java | 二分法查询

以下是二分法的实现和基本思路

import java.util.Arrays;

/**
 * @ClassName: BinarySearch
 * @Description: 二分法查询
 * 基本思路:
 *      1.首先将待查数据num与排序的一组数据的中间位置arr[m]上的数据进行比较, 若相等,则查找成功.
 *      2.若num>arr[m],则待查数据num只可能出现在右半部arr[m+1…n]中,则应在这个右半部中再进行折半查找.
 *      3.若num<arr[m],则待查数据num只可能出现在左半部arr[1…m-1]中,则应在这个左半部中再进行折半查找.
 *      过逐步缩小查找范围,直到找到或找不到该数据num为止。
 * @Author: HelSon
 * @Date 2019-06-20
 * @Version V1.0
 **/
public class BinarySearch {
    /**
     * 二分查询(递归)
     */
    public static int findNum1(int[] arr, int num) {
        return findNum1(arr, num, 0, arr.length);
    }

    private final static int findNum1(int[] arr, int num, int begin ,int end) {
        if(begin > end){
            return -1;
        }
        int m = (begin + end) >> 1;
        if (num == arr[m]) {
            return m;
        }
        if (num > arr[m]) {
            return findNum1(arr, num, m+1, end);
        } else {
            return findNum1(arr, num, begin, m-1);
        }
    }

    /**
     * 二分查询(非递归)
     * 基本思路:
     * @param arr 排序后的数组
     * @param num 查找的书
     */
    public static int findNum2(int[] arr, int num) {
        int begin = 0;
        int end = arr.length - 1;
        int m = 0;
        while (begin <= end) {
            m = (begin + end) >> 1;
            if (num == arr[m]) {
                return m;
            }
            if (num > arr[m]) {
                begin = m + 1;
            }
            if (num < arr[m]) {
                end = m - 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        // 1. 先排序
        int[] arr = { 2, 10, 4, 8, 9 , 8,20,30,40,11,13};
        Arrays.sort(arr);
        System.out.print("排序后数组:");
        for (int i : arr) {
            System.out.print(i + "\t");
        }
        System.out.println();
        // 查询的数值
        int findNumber = 40;
        // 2.1. 寻找(递归)
        int index1 = findNum1(arr, findNumber);
        System.out.println("搜索下标为:" + index1);

        // 2.2. 寻找(非递归)
        int index2 = findNum2(arr, findNumber);
        System.out.println("搜索下标为:" + index2);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值