数据结构与算法__冒泡排序__Java外比较器和内比较器(排序专题)

简介: 数据结构与算法__冒泡排序__Java外比较器和内比较器(排序专题)

大家好,我是ChinaManor,直译过来就是中国码农的意思,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人。

要是数据结构那么简单没人想当码农,为了摆脱码农还是得硬着头皮学

目的:为了更好地学习和理解数组排序,为了面试作准备

冒泡排序:是一种计算机科学领域较常见的排序算法。

因为它的算法就如同 碳酸饮料中二氧化碳气泡最终会上浮到顶端一样,所以形象化称为“冒泡排序”

原理小结:

依次“对比”或“交换”数组中每两个相邻的元素,

使最值元素通过交换,慢慢“浮到”数组顶端。

课堂代码:

/**
 * 冒泡入门-第三版
 *
 * 相邻元素:  j  和  j+1
 * @param args
 */
public static void main(String[] args) {
    int[] arr = {55,44,11};
    System.out.println("冒泡前:"+ Arrays.toString(arr));
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j <arr.length-i ; j++) {
            if(arr[j]>arr[j+1]){
                //交换
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}
/**
 * 冒泡入门-第三版
 *
 * 相邻元素:  j  和  j+1
 * @param args
 */
public static void main(String[] args) {
    int[] arr = {55,44,11};
    System.out.println("冒泡前:"+ Arrays.toString(arr));
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j <arr.length-i ; j++) {
            if(arr[j]>arr[j+1]){
                //交换
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
            System.out.println(Arrays.toString(arr));
        }
    }
}

升序—从小到大: arr[j]>arr[j+1]

降序—从大到小: arr[j]<arr[j+1]

如果自己写排序,费时费力 所以下面我们介绍两种为List集合进行排序

5.2准备数据

Person类:

public class Person {
    private String name;
    private int age;
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    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;
    }
}

Demo1类:

public class Demo1 {
    public static void main(String[] args) {
        //1、准备数据
        ArrayList<Person> plist = new ArrayList<Person>();
        plist.add(new Person("小1",15));
        plist.add(new Person("小2",19));
        plist.add(new Person("小3",11));
        plist.add(new Person("小4",16));
        plist.add(new Person("小5",12));
    }
}

5.3Comparator比较器(外比较器)

凡是实现了Comparator接口的类,都是外比较器类。

只要重写接口中的compare方法,即可完成比较。

示例:

public static void main(String[] args) {
    //1、准备数据
    List<Person> plist = new ArrayList<Person>();
    plist.add(new Person("小1",15));
    plist.add(new Person("小2",19));
    plist.add(new Person("小3",11));
    plist.add(new Person("小4",16));
    plist.add(new Person("小5",12));
    //2、处理数据:通过人的年龄,比较大小。
plist.sort(new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
});
    System.out.println(plist);
}

建议:无需记忆何谓从大到小,何谓从小到大,尝试一次即可

另一种方式:

Collections.sort(plist, new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
        return o1.getAge()-o2.getAge();
    }
});

注意:

正数、0: o1和o2位置就不会交换

负数: o1和o2位置交换

使用环境:

适用于一题多解的模式。

Person类,先进行年龄排序,后面可能还会进行成绩排序,学号排序

5.4Comparable接口(内比较器)

需要Person类自己实现Comparable接口,通过Collections工具进行排序比较

Person类:

public class Person implements Comparable{
    private String name;
    private int age;
    @Override
    public int compareTo(Object o) {
        return this.getAge()-((Person)o).getAge();
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Person() {
    }
    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;
    }
}

Demo1类:

public static void main(String[] args) {
    //1、准备数据
    List<Person> plist = new ArrayList<Person>();
    plist.add(new Person("小1",15));
    plist.add(new Person("小2",19));
    plist.add(new Person("小3",11));
    plist.add(new Person("小4",16));
    plist.add(new Person("小5",12));
    //2、处理数据
    Collections.sort(plist);
    System.out.println(plist);
}

注意:

比较器的CompareTo方法:

正数、0:不会交换

负数:交换位置

排序总结

如果一个类在不同题目中以各种方式排序,就用Comparator外比较器。

例如:Person类在题目1中用年龄排序

在题目2中用分数排序

在题目3中用生日排序

这时,一道题就要写一个外比较器

如果一个类在不同题目中以同一种方式排序,就用Comparable内比较器

例如:Person类在题目1、题目2、题目3中 都是用年龄排序,这时,就可以统一在Person类中写一个内比较器

一个类在不同题目中,经常是要不同方式排序, 外比较器使用频率最高


目录
相关文章
|
3天前
|
搜索推荐 算法 Java
sort-01-bubble sort 冒泡排序算法详解
这是一个关于排序算法的系列文章摘要。作者整理了10种不同的排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序和大文件外部排序。文章详细介绍了冒泡排序的工作原理、流程,并提供了代码实现,强调了在实现中考虑的改进点,如统一接口、实用性增强和日志输出。此外,还提供了一个排序接口和工具类以方便使用,并通过测试代码和日志展示了排序过程。整个系列旨在帮助读者理解和掌握排序算法。相关代码已开源在GitHub。
|
5天前
|
存储 算法 Java
wtf?java的冒泡排序还可以这样写
wtf?java的冒泡排序还可以这样写
8 1
|
6天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
11天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
21天前
|
存储 算法 搜索推荐
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
|
21天前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
23天前
|
Java 索引
Java练习题-用冒泡排序法实现数组排序
Java练习题-用冒泡排序法实现数组排序
14 2
|
28天前
|
搜索推荐 Java
Java排序算法
Java排序算法
18 0
|
28天前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
24 4
|
28天前
|
搜索推荐 算法 Java
Java基础(冒泡排序算法)
Java基础(冒泡排序算法)
19 3