二分查找/折半查找

本文展示了如何在Java中实现二分查找算法,强调了数组必须有序这一前提。首先,通过生成并排序随机数组,然后读取用户输入的数字,通过不断调整最小值和最大值的边界,找到目标数字的位置或确认其不存在于数组中。
摘要由CSDN通过智能技术生成

使用二分查找要求:数组必须有序

二分查找最基础的思路:

1.数组的排列顺序——从小到大排列的,左边的一定比右边的小

2. 用户输入的数据n(设n=12)

3.设定数组下标的最大值和最小值  minln=0;maxln=length-1  maxln>minln(必要条件)

    (1)    min  0   max  20==>middle  10

                n<middle对应的值:n在middle左边

     (2) min=0  max  9==>middle  4

                n<middle对应的值    n在middle左边
    (3)min=0   max   3==>middle   1

                n>middle对应的值   n在middle右边

    (4)  min   2  max  3==>middle  2

                n<middle  对应的值   n在middle左边

 代码展示:

package com.qf.javase.day09;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 二分查找/折半查找
 * @author cc
 * @version 1.0
 * @date 2023/4/27 10:50
 */
public class BinarySearchDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        创建
//        创建一个数组
        int[] nums=new int[20];
//       使用随机数填充
        for (int i=0;i<nums.length;i++)
        {
            nums[i]=(int)(Math.random()*100);

        }
        System.out.println(Arrays.toString(nums));

        System.out.println("请输入一个100以内的数字");
        int n = scanner.nextInt();

//        之前的查询方法,对于数组几乎没有任何要求
//        for (int i=0;i<nums.length;i++)
//        {
            获取当前数据
//            int num=nums[i];
//            if (num==n)
//            {
//                System.out.println("找到了");
//                break;
//
//            }
//        }


//        二分查找:要求数组必须有序,速度很快
//        二分查找:基本思路
//        数组长度设置21


//        排序让数组有序
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        boolean  notExists=true;//为判断输出使用
//        声明变量  ——保存下标的最大值和最小值
        int minIndex=0;
        int  maxIndex=nums.length-1;
        int middle;
//        n大于数组的最大值,小于数组的最小资,绝对不再数组中,直接return 后续不用输出
        if (n>nums[maxIndex]||n<nums[minIndex]){
            System.out.println("该数字不再数组中");
            return;
        }

        while (maxIndex>=minIndex)
        {
            System.out.println(minIndex+"-"+maxIndex);
//            计算当前下标范围内的中间值
            middle= (maxIndex+minIndex)/2;
//            判断middle对应的数据  和用户输入的数据的大小关系

            if (n==nums[middle])
            {
                System.out.println("数组中存在这样的数字");
                notExists=false;
                break;

            }else{
                if (n<nums[middle]){
//                    那么n一定在middle的左边,最大值变为middle的前一个
                    maxIndex=middle-1;
                }else {
//                    n>nums[middle]
//                    那么n一定在middle的右边, 最小值变为middle后面的一个
                    minIndex=middle+1;
                }
            }
        }
//        如何输出采用boolean 做处理
        if (notExists) {
            System.out.println("该数字不再数组中");
        }
        scanner.close();

    }


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值