三傻排序(冒泡,选择,插入)Java大白话(老毕登可以跳过)

三种排序算法详解

本文档解释了三种基本的排序算法及其Java实现。所有实现都将相同的数组[1, 6, 8, 2, 3]按升序排列。

1. 选择排序 (choose.java)

选择排序通过重复从未排序部分找到最小元素并将其放置在开头来工作。

工作原理:

  1. 在整个数组中找到最小元素并与第一个元素交换
  2. 在剩余未排序部分找到最小元素并与第二个元素交换
  3. 重复此过程直到整个数组有序

实现代码:

java 复制代码
public static void main(String[] args) {
    int[] a = {1, 6, 8, 2, 3};
    for (int i = 0; i < a.length; i++) {
        int index = i;
        for (int j = i; j < a.length; j++) {
            if (a[index] > a[j]) {
                index = j;
            }
        }
        int temp = a[i];
        a[i] = a[index];
        a[index] = temp;
    }
    System.out.println(Arrays.toString(a));
}

特点:

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 不稳定(可能会改变相等元素的相对顺序)
  • 在小数据集上表现良好

2. 冒泡排序 (effervescence.java)

冒泡排序通过重复遍历列表,比较相邻元素并在顺序错误时交换它们来工作。每一轮遍历后,最大的元素会"冒泡"到数组的末尾。

工作原理:

  1. 比较相邻元素,如果左边的大于右边的则交换它们
  2. 每次完整遍历后,未排序元素中的最大值会移动到正确位置
  3. 重复直到不需要交换为止

实现代码:

java 复制代码
public static void main(String[] args) {
    int[] a = {1, 6, 8, 2, 3};
    for (int i = 0; i < a.length - 1; i++) {
        for (int j = 0; j < a.length - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(a));
}

特点:

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定排序算法
  • 自适应 - 可以检测列表是否已经排序

3. 插入排序 (insert.java)

插入排序通过逐个构建最终的排序数组来工作。它的工作方式类似于人们如何整理手中的扑克牌。

工作原理:

  1. 从第二个元素(索引1)开始
  2. 将其与前面的元素比较并插入到正确位置
  3. 移动到下一个元素并重复直到整个数组有序

实现代码:

java 复制代码
public static void main(String[] args) {
    int[] a = {1, 6, 8, 2, 3};
    for (int i = 0; i < a.length; i++) {
        int j = i;
        for (; j > 0; j--) {
            if (a[j] < a[j - 1]) {
                int temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            } else
                break;
        }
    }
    System.out.println(Arrays.toString(a));
}

特点:

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定排序算法
  • 对小数据集高效
  • 自适应 - 对已基本排序的数据集很高效

总结

这三种算法都具有O(n²)的时间复杂度,使得它们对于大数据集来说效率不高。但它们对教育目的和小数组排序很有价值。每种算法都有自己的优势:

  • 插入排序是其中最有价值的,一句话,假设一侧是有序的,新元素去寻找有序列表的位置
  • 选择排序最小化交换次数,一句话,假设一侧是有序的,去剩下的选择一个最大或者最小然后放入末尾
  • 冒泡排序简单易懂且易于实现 ,一句话,假设一侧是有序的,从开头或者结尾,不断就近比较,把最大最小拱到一侧
  • 插入排序对于近似排序的数组很高效,并且是稳定的

对于较大的数据集,更高级的算法如快速排序、归并排序或堆排序将是更合适的选择。

相关推荐
NAGNIP16 分钟前
程序员效率翻倍的快捷键大全!
前端·后端·程序员
qq_2562470524 分钟前
从“人工智障”到“神经网络”:一口气看懂 AI 的核心原理
后端
无心水25 分钟前
分布式定时任务与SELECT FOR UPDATE:从致命陷阱到优雅解决方案(实战案例+架构演进)
服务器·人工智能·分布式·后端·spring·架构·wpf
用户4001883093727 分钟前
手搓本地 RAG:我用 Python 和 Spring Boot 给 AI 装上了“实时代码监控”
后端
用户34140819912528 分钟前
/dev/binder 详解
后端
Gopher_HBo38 分钟前
Go进阶之recover
后端
程序员布吉岛41 分钟前
写了 10 年 MyBatis,一直以为“去 XML”=写注解,直到看到了这个项目
后端
却尘42 分钟前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
茶杯梦轩42 分钟前
从零起步学习Redis || 第七章:Redis持久化方案的实现及底层原理解析(RDB快照与AOF日志)
redis·后端
QZQ5418843 分钟前
重构即时IM项目13:优化消息通路(下)
后端