一、什么是冒泡排序?

冒泡排序(Bubble Sort)是一种基础的交换排序算法,因其排序过程中元素像水中的气泡一样逐渐 "上浮" 到正确位置而得名。

它的核心思想很简单:重复遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。直到遍历完所有元素且没有发生交换,说明数组已经有序。

二、冒泡排序的工作原理

我们以一个无序数组 [5, 2, 9, 3, 6] 为例,一步一步看冒泡排序的过程:

  1. 第一趟遍历(找出最大的元素 "9" 并放到最后):

    • 比较 5 和 2 → 顺序错误,交换 → [2, 5, 9, 3, 6]
    • 比较 5 和 9 → 顺序正确,不交换
    • 比较 9 和 3 → 顺序错误,交换 → [2, 5, 3, 9, 6]
    • 比较 9 和 6 → 顺序错误,交换 → [2, 5, 3, 6, 9]第一趟结束后,最大的元素 "9" 已 "浮" 到数组末尾。
  2. 第二趟遍历(找出第二大的元素 "6" 并放到倒数第二位):

    • 比较 2 和 5 → 不交换
    • 比较 5 和 3 → 交换 → [2, 3, 5, 6, 9]
    • 比较 5 和 6 → 不交换第二趟结束后,第二大的元素 "6" 已到位(此时只需遍历前 4 个元素)。
  3. 第三趟遍历(无需交换,数组已有序):

    • 比较 2 和 3 → 不交换
    • 比较 3 和 5 → 不交换遍历结束,数组已完全有序:[2, 3, 5, 6, 9]

三、冒泡排序的代码实现(C 语言)

下面是冒泡排序的基础实现,包含优化点(当某趟遍历没有交换时,说明数组已有序,可提前退出):

#include <stdio.h>

// 冒泡排序函数
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        int swapped = 0;  // 标记本趟是否发生交换
        // 每趟遍历后,最大元素已到位,下一趟可少遍历一个元素
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {  // 相邻元素比较
                // 交换元素
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
                swapped = 1;  // 发生交换,标记为1
            }
        }
        // 若本趟没有交换,说明数组已有序,直接退出
        if (swapped == 0) {
            break;
        }
    }
}

// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {5, 2, 9, 3, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    printf("排序前的数组:");
    printArray(arr, n);
    
    bubbleSort(arr, n);
    
    printf("排序后的数组:");
    printArray(arr, n);
    
    return 0;
}

运行结果:

排序前的数组:5 2 9 3 6 
排序后的数组:2 3 5 6 9 

四、冒泡排序的特点分析

优点:

  1. 简单易懂:逻辑直观,适合新手入门排序算法。
  2. 稳定性好:相等元素的相对顺序在排序后不会改变(例如 [2, 5, 2] 排序后仍为 [2, 2, 5])。
  3. 原地排序:不需要额外的存储空间,空间复杂度为 O (1)。

缺点:

  • 效率较低:时间复杂度为 O (n²)(最坏和平均情况),不适合处理大规模数据。

五、什么时候用冒泡排序?

冒泡排序更适合作为学习排序思想的入门案例,实际开发中很少用于处理大量数据。但在以下场景中可以考虑:

  • 数据量极小(如少于 100 个元素)。
  • 对排序稳定性有要求,且数据基本有序(此时优化后的冒泡排序效率接近 O (n))。
  • 需要用最简单的代码实现排序功能(无需记忆复杂算法)。

总结

冒泡排序是最经典的排序算法之一,它通过重复比较相邻元素并交换来实现排序。虽然效率不高,但理解其原理能帮助我们掌握 "交换排序" 的核心思想,为学习更复杂的算法(如快速排序)打下基础。

记住:算法没有绝对的好坏,只有适合与否。冒泡排序的简单性,正是它不可替代的价值

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐