java基础day_04(查找:二分查找法,Arrays工具类)

二分查找

查找前提:有序序列

每次寻找时,折半,将目标值与本次中间值进行对比,如果大于中间值就在其后面找,如果小于中间值就在其前面找(即缩小队列长度),然后再次折半找,缩小目标值所在区间范围,直到最终的中间值序列的值等于目标值(即找到目标所在位置)。

二分查找方式:(想法与快排类似)

//1.定义最小索引、最大索引

//2.计算中间索引

//3.拿查找的值和中间索引的值进行对比

//三种情况:1.相等,直接返回 2.中间值更大,往左找 3.中间值更小,往又找

//继续循环上面的2和3,直到最终找出目标值

写方法的两个要点:

1.是否有返回值,方法类型(返回值类型)

2.参数列表里的参数类型

案例代码如下

public class BinarySearch {
    public static void main(String[] args) {
        int[]arr ={1,5,6,7,8,9,10};
        System.out.println(binarySearch(arr, 6));
    }
    
    public static int binarySearch(int[] arr,int value){
        int max=arr.length-1,min=0;
        int mid=(max+min)/2;
        while(value !=arr[mid]){
            //判断value在前还是在后
            //当在中间值前面
            if (value<arr[mid]){
                max=mid-1;
                mid=(max+min)/2;
            }
            //当在中间值后面
            else if (value>arr[mid]){
                min=mid+1;
                mid=(max+min)/2;
            }
            else //如果前面两个都不符合,而且value不等于中间值,说明找不到
            return -1;
        }
        return mid;

    }
}

二分查找小练习:(用到了随机生成数方法random)

数组中,存放了10位同学的平均成绩,其中张三的成绩是84分,其他人的平均成绩在70-100之间随机生成

求:生成成绩后,张三的成绩在班级中的排名是多少

案例代码如下

public class Demo01 {
    public static void main(String[] args) {
        /*
        数组中,存放了10位同学的平均成绩,其中张三的成绩是84分,
        其他人的平均成绩在70-100之间随机生成
        求:生成成绩后,张三的成绩在班级中的排名是多少
         */

        //随机生成数组数据
        int[] arr = new int[10];
        arr[0] = 84;
        //创建随机数对象random
        Random random = new Random();
        for (int i = 1; i < arr.length; i++) {
            arr[i] = random.nextInt(30) + 70;
        }
        System.out.println("所有学生的平均成绩:");
        BubbleSort.printArray(arr);
        //数组排序
        BubbleSort.bubbleSort(arr);
        //数组查找
        int index = BinarySearch.getIndex(arr, 84);
        int paiming = arr.length - index;
        System.out.println("张三的排名是:" + paiming);
    }
}

Arrays工具类

在日常开发过程中,会根据用户的各种需求来定义不同类型的数组,我们可以调用之前编写的各种数组方面的方法,但是会出现现有方法的类型跟需求不匹配的问题。因而需要重新修改代码,非常麻烦。

jdk提供给我们使用的一个工具类,工具类中一般都封装了 很多的方法,可以给我们使用

关于工具类中各种现有方法的使用案例如下


public class ArraysDemo {
    public static void main(String[] args) {
        int[] arr = {10,33,4,21,35,6};
        //toString()方法, 将数组以字符串形式输出
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr); //调用排序方法
        System.out.println(Arrays.toString(arr));

        int i = Arrays.binarySearch(arr, 33); //搜索
        System.out.println(i);
            //复制数组
        int[] arr01 = Arrays.copyOf(arr, 10);
        System.out.println(Arrays.toString(arr01));

        char[] charArray = {'a','c','b','x','f'};
        Arrays.sort(charArray);
        System.out.println(Arrays.toString(charArray));
    }
}

利用工具类中现成的方法,可以大大加快开发效率(前提是要使用正确类型的方法,同时涉及到工具类的导入问题)关于一个工具类中往往包含多个同名的方法(方法类型不同),涉及到方法的重载,这在后面的学习过程中将会得到解释。

 PS:多个同名的方法(方法重载)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值