Arrays类、常见算法(选择排序、二分查找)

一. Arrays类

1.1 Arrays类概述以及Arrays类常用API

Arrays类概述

  • Arrays类是数组操作工具类,专门用于操作数组元素的。

package com.gch.d8_arrays;

import java.util.Arrays;

public class ArraysDemo1 {
    public static void main(String[] args) {
        // 目标:学会使用Arrays类的常用API,并理解其原理
        int[] arr = {10, 2, 55 ,23, 24, 100};
        System.out.println(arr); // [I@4554617c

        // 1.返回数组内容的 toString(arr)
//        String rs = Arrays.toString(arr);
//        System.out.println(rs);
        System.out.println(Arrays.toString(arr)); // [10, 2, 55, 23, 24, 100]

        // 2.排序的API(默认自动对数组元素进行升序排序)
        Arrays.sort(arr); // 快排机制
        System.out.println(Arrays.toString(arr)); // [2, 10, 23, 24, 55, 100]

        // 3.二分搜索技术(前提数组必须排好序才支持,否则出bug)
        // 非常优秀的一种数据搜索算法,可以极大的提高性能
        int index = Arrays.binarySearch(arr , 55);
        System.out.println(index); // 4

        // 返回不存在元素的规律: -(应该插入的位置索引 + 1)
        int index1 = Arrays.binarySearch(arr , 555);
        System.out.println(index1); // -7

        // 注意:数组如果没有拍好序,可能会找不到存在的元素,从而出现bug!!
        int[] arr2 = {12, 36, 34, 25, 13, 24, 234, 100};
        int index2 = Arrays.binarySearch(arr2 , 36);
        System.out.println(index2); // -7
    }
}

1.2 Arrays类对于Comparator比较器的支持

  • 自定义Comparator比较器对象,只能支持引用数据类型的排序!!!
  • Comparator是一个函数式接口

 

package com.gch.d8_arrays;

import java.util.Arrays;
import java.util.Comparator;

public class ArraysDemo2 {
    public static void main(String[] args) {
        // 目标:自定义数组的排序规则:Comparator比较器对象。
        // 1.Arrays的sort方法对于有值特性的数组是默认升序排序
        int[] ages = {34, 12, 42, 23};
        Arrays.sort(ages);
        System.out.println(Arrays.toString(ages)); // [12, 23, 34, 42]

        // 2.需求:降序排序!(自定义比较器对象,只能支持引用类型的排序!!)
        Integer[] ages1 = {34, 12, 42, 23};
        Arrays.sort(ages1, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // 指定比较规则
//                if(o1 > o2){
//                    return 1;
//                }else if(o1 < o2){
//                    return -1;
//                }
//                return 0;

                // return o1 - o2; // 默认升序
                return o2 - o1; // 降序
            }
        });
        System.out.println(Arrays.toString(ages1)); // [42, 34, 23, 12]
        System.out.println("------------------------------------------------");
        Student[] students = new Student[3];
        students[0] = new Student("吴磊", 23, 175.5);
        students[1] = new Student("谢鑫", 18 ,185.5);
        students[2] = new Student("王亮", 20, 195.5);

        // 没有重写toString方法,默认打对象的地址
        System.out.println(Arrays.toString(students));

//        Arrays.sort(students); // 直接运行崩溃
        Arrays.sort(students, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // 自己制定比较规则   compare方法返回值类型为int
//                return o1.getAge() - o2.getAge(); // 按照年龄升序排序
//                return o2.getAge() - o1.getAge(); // 按照年龄降序排序
                // 浮点型排序不能这样写  173.3 - 173.0 = 0.3,转为int为0,认为这两个人身高相等,会出bug
//                return (int) (o1.getHeight() - o2.getHeight());
                // 按照身高升序排序   比较浮点型可以这样写,也必须这样写
//                return Double.compare(o1.getHeight() , o2.getHeight());
                // 按照身高降序排序
                return Double.compare(o2.getHeight() , o1.getHeight());
            }
        });
        System.out.println(Arrays.toString(students));
    }
}

package com.gch.d8_arrays;

public class Student {
    private String name;
    private int age;
    private double height;

    /*
       重写toString方法
     */
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", height=" + height +
                '}';
    }

    public Student(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }
}

 二、常见算法

2.1 选择排序

package com.gch.d9_sort_binarysearch;

import java.util.Arrays;

/**
   目标:学会使用选择排序的方法对数组进行排序
 */
public class Test1 {
    public static void main(String[] args) {
        // 1.定义数组
        int[] arr = {5, 1, 3, 2};
        //           0  1  2  3

        // 2.定义一个外部循环控制选择几轮:arr.length - 1
        for(int i = 0;i < arr.length;i++){
            // i = 0   j = 1 2 3
            // i = 1   j = 2 3
            // i = 2   j = 3
            // 3.定义内部循环,控制选择几次
            for(int j = i + 1;j < arr.length;j++){
                // 当前位:arr[i]
                // 如果有比当前位数据更小的(或者当前位比后面的值大),则交换
                if(arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr)); // [1, 2, 3, 5]
    }
}

2.2 二分查找

  • 二分查找的思路:定义两个位置,一个在前,一个在后,这样才能折半,前面位置和后面位置,一半的位置作为中间索引。
  • min和max表示查找的范围
  •  二分查找相当于每次去掉一半儿的查找范围,检索速度非常快
  • 二分查找一旦发现左边位置等于右边位置还没有确定值的话,那就说明找不到了

 

 

package com.gch.d9_sort_binarysearch;

import java.util.Arrays;

/**
   目标:理解二分搜索的原理并实现
 */
public class Test2 {
    public static void main(String[] args) {
        // 1.定义一个拍好序的数组
        int[] arr = {10, 14, 16, 25, 28, 30, 35, 88, 100};
        System.out.println(binarySearch(arr , 35));
    }

    /**
     * 二分查找算法的实现
     * @param arr 排好序的数组
     * @param data 要找的数据
     * @return 返回索引,如果元素不存在,直接返回-1
     */
    public static int binarySearch(int[] arr,int data){
        // 1.定义左边位置 和 右边位置
        int left = 0;
        int right = arr.length - 1;

        // 2.开始循环,折半查询。
        while(left <= right){
            // 取中间索引  折半的位置精确不精确没有关系
            int middleIndex = (left + right) / 2;
            // 3.判断当前中间位置的元素和要找的元素的大小情况
            if(data > arr[middleIndex]){
                // 往右边找,左位置更新为 = 中间索引 + 1
                left = middleIndex + 1;
            }else if(data < arr[middleIndex]){
                // 往左边找,右位置更新为 = 中间索引 - 1
                right = middleIndex - 1;
            }else {
                return middleIndex;
            }
        }
        return -1; // 查无此元素
    }

}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Surpass余sheng军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值