三傻排序(冒泡,选择,插入)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²)的时间复杂度,使得它们对于大数据集来说效率不高。但它们对教育目的和小数组排序很有价值。每种算法都有自己的优势:

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

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

相关推荐
我是谁的程序员25 分钟前
iOS CPU 占用率在性能问题中的表现形式
后端
一灰灰26 分钟前
开发调试与生产分析的利器:MyBatis SQL日志合并插件,让复杂日志秒变可执行SQL
chrome·后端·mybatis
Code blocks28 分钟前
SpringBoot从0-1集成Minio对象存储
java·spring boot·后端
疯狂的程序猴30 分钟前
iOS 上架需要哪些准备,围绕证书、描述文件和上传方式等关键环节展开分析
后端
无限大61 小时前
为什么"API"很重要?——从封闭系统到开放生态
后端
王中阳Go1 小时前
Golang框架封神榜!GitHub星标TOP8大比拼,选对框架少走3年弯路
后端·面试·go
扑克中的黑桃A1 小时前
当中断绑核遇上大模型推理:HostBound 问题优化全解析(昇腾深度实战版)
后端
七月丶1 小时前
实战复盘:我为什么把 TypeScript 写的 CLI 工具用 Rust 重写了一遍?
前端·后端·rust
王中阳Go2 小时前
05 Go Eino AI应用开发实战 | Docker 部署指南
人工智能·后端·go
普通网友2 小时前
Bash语言的图算法
开发语言·后端·golang