使用二分查找要求:数组必须有序
二分查找最基础的思路:
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();
}
}