【算法】冒泡排序的原理及实现

算法思想

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端,就如同水中的气泡最终会上浮到顶端一样,故名"冒泡排序"。

排序过程示例

让我们通过一个具体的例子来理解冒泡排序的过程:

原始数据: 5, 3, 8, 6, 2

第一轮排序

  • 比较 5 和 3:5>3,交换 → 3, 5, 8, 6, 2
  • 比较 5 和 8:5<8,不交换 → 3, 5, 8, 6, 2
  • 比较 8 和 6:8>6,交换 → 3, 5, 6, 8, 2
  • 比较 8 和 2:8>2,交换 → 3, 5, 6, 2, 8

第一轮结果: 3, 5, 6, 2, 8(最大的数 8 已经沉底)

第二轮排序

  • 比较 3 和 5:3<5,不交换 → 3, 5, 6, 2, 8
  • 比较 5 和 6:5<6,不交换 → 3, 5, 6, 2, 8
  • 比较 6 和 2:6>2,交换 → 3, 5, 2, 6, 8

第二轮结果: 3, 5, 2, 6, 8(第二大的数 6 就位)

第三轮排序

  • 比较 3 和 5:3<5,不交换 → 3, 5, 2, 6, 8
  • 比较 5 和 2:5>2,交换 → 3, 2, 5, 6, 8

第三轮结果: 3, 2, 5, 6, 8(第三大的数 5 就位)

第四轮排序

  • 比较 3 和 2:3>2,交换 → 2, 3, 5, 6, 8

最终结果: 2, 3, 5, 6, 8(排序完成)

性能分析

时间复杂度

  • 最坏情况: O(n²) - 当数组完全逆序时
  • 最好情况: O(n) - 当数组已经有序时(优化版本)
  • 平均情况: O(n²)

空间复杂度

  • 空间复杂度: O(1) - 只需要常数级别的额外空间

Java 实现代码

java 复制代码
public class BubbleSort {

    /**
     * 基础版冒泡排序
     */
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换元素
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    /**
     * 优化版冒泡排序 - 添加标志位检测是否已有序
     */
    public static void optimizedBubbleSort(int[] arr) {
        int n = arr.length;
        for (int i = 0; i < n - 1; i++) {
            boolean swapped = false;
            for (int j = 0; j < n - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    // 交换元素
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    swapped = true;
                }
            }
            // 如果这一轮没有发生交换,说明数组已经有序
            if (!swapped) break;
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2};
        System.out.println("排序前: " + Arrays.toString(arr));

        optimizedBubbleSort(arr);

        System.out.println("排序后: " + Arrays.toString(arr));
    }
}

运行结果:

使用场景

适用情况

  1. 教学目的:由于算法简单直观,常用于算法教学
  2. 小规模数据:当数据量较小时(如 n < 1000),冒泡排序的性能可以接受
  3. 基本有序的数据:对于已经基本有序的数据,优化版的冒泡排序效率较高
  4. 内存受限环境:由于空间复杂度为 O(1),适合内存受限的场景

不适用情况

  1. 大规模数据:当数据量很大时,O(n²)的时间复杂度会导致性能急剧下降
  2. 对性能要求高的场景:在需要高效排序的生产环境中,通常选择更高效的算法如快速排序、归并排序等

实际应用

虽然冒泡排序在实际工程中较少使用,但理解其原理对于学习更复杂的排序算法很有帮助。在某些特定场景下,如嵌入式系统或对代码简洁性要求极高的场合,冒泡排序仍有一定的应用价值。

总结

冒泡排序作为最基础的排序算法之一,虽然效率不高,但其思想简单易懂,是学习排序算法的良好起点。在实际开发中,我们更倾向于使用更高效的排序算法,但理解冒泡排序的原理对于培养算法思维仍然具有重要意义。

原文:【算法】冒泡排序的原理及实现

相关推荐
mldong4 小时前
引擎从不发一条消息:jeeflow 的两类扩展点与消息模块的分工
java·架构
君顾14 小时前
智慧零售实战指南:从技术架构到落地方案全解析
java·开发语言·零售
北域码匠4 小时前
高通滤波算法深度解析(High-Pass Filter)
stm32·算法·c#·数字信号处理·嵌入式开发·滤波算法·高通滤波
zhanghe6875 小时前
es的密码带有特殊字符,导出
java
指掀涛澜天下惊5 小时前
强化学习进阶篇八 策略梯度算法
深度学习·学习·算法·强化学习
pnoker5 小时前
IoT DC3 概念解读:把设备抽象成一套语义模板——位号、指令、事件与面向智能体的设备建模
java·人工智能·物联网·iot·dc3
乌萨奇也要立志学C++5 小时前
【洛谷】kmp算法
开发语言·算法
my_realmy5 小时前
Java SE 基础学习笔记(一):面向对象、继承多态、抽象接口与异常(JDK 8)
java·多线程·并发··生产者消费者模式
禹凕5 小时前
Dijkstra算法详解与应用
python·算法
天远数科6 小时前
风险治理实战:基于天远车信盟出险构建自动化理赔核保流水线
java·网络·人工智能·自动化