数据结构与算法__冒泡排序__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类中写一个内比较器

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


目录
相关文章
|
2月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
120 29
|
2月前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
3月前
|
存储 人工智能 算法
解锁分布式文件分享的 Java 一致性哈希算法密码
在数字化时代,文件分享成为信息传播与协同办公的关键环节。本文深入探讨基于Java的一致性哈希算法,该算法通过引入虚拟节点和环形哈希空间,解决了传统哈希算法在分布式存储中的“哈希雪崩”问题,确保文件分配稳定高效。文章还展示了Java实现代码,并展望了其在未来文件分享技术中的应用前景,如结合AI优化节点布局和区块链增强数据安全。
|
3月前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
78 32
|
3月前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
138 16
|
3月前
|
存储 监控 算法
剖析基于Java算法驱动的智能局域网管控之道
本文探讨了基于Java语言的局域网控制方案,结合链表数据结构与令牌桶算法,解决设备管理和流量调度难题。通过链表灵活存储网络设备信息,实现高效设备管理;令牌桶算法则精准控制流量,确保网络平稳运行。二者相辅相成,为校园、企业等局域网提供稳固高效的控制体系,保障业务连续性和数据安全。
|
3月前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
121 6
|
3月前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
102 5
|
3月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
98 10
|
3月前
|
搜索推荐 算法 数据处理
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
90 10