“冒个泡泡”,排个序呗~:C语言版冒泡排序全解

🎯 算法简介
冒泡排序(Bubble Sort) 是一种基础但直观的排序算法。它通过重复地遍历数组,比较相邻的元素并交换它们的位置,使得较大的元素逐渐"浮"到数组的末尾,就像水中的气泡一样慢慢上升。

📌 特点:

✅ 实现简单,适合教学

❌ 时间复杂度为 O(n²),效率较低

✅ 稳定排序算法

✅ 可以进行提前终止优化
🧠 原理
假设我们有数组:{5, 3, 8, 4, 2}

第一轮比较:
比较 5 和 3 → 交换 → {3, 5, 8, 4, 2}
比较 5 和 8 → 不交换 → {3, 5, 8, 4, 2}
比较 8 和 4 → 交换 → {3, 5, 4, 8, 2}
比较 8 和 2 → 交换 → {3, 5, 4, 2, 8} ✅ 最大值"8"沉底
第二轮继续对前四个数进行类似操作......
最终每一轮都将一个最大值放到正确位置,直到整个数组有序。

🛠️ 实现步骤详解

步骤一:定义函数和参数

C

cs 复制代码
void bubble_sort(int arr[], int n)
//arr[]:待排序的整型数组
//n:数组中元素的数量

步骤二:外层循环控制排序轮数

C

cs 复制代码
for (int i = 0; i < n - 1; i++)
//总共需要 n - 1 轮比较

步骤三:内层循环进行相邻元素比较和交换

C

cs 复制代码
for (int j = 0; j < n - i - 1; j++)

每轮减少一个已排好序的元素,所以范围递减

步骤四:判断是否需要交换

C

cs 复制代码
if (arr[j] > arr[j + 1]) {
    // 交换逻辑
}

步骤五:添加优化 ------ 提前结束排序

C

cs 复制代码
int swapped = 0;
...
if (!swapped) break;
//如果某次遍历没有发生任何交换,说明数组已经有序,可提前退出

🧪 完整代码示例

C

cs 复制代码
#include <stdio.h>

// 冒泡排序函数
void bubble_sort(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;
            }
        }

        // 如果本轮没有发生交换,说明数组已有序,提前结束
        if (!swapped)
            break;
    }
}

// 主函数用于测试
int main() {
    int arr[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(arr) / sizeof(arr[0]);  // 计算数组长度

    printf("原数组: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    bubble_sort(arr, n);  // 调用冒泡排序函数

    printf("\n\n排序后: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

⚙️ 示例运行结果:

bash 复制代码
原数组: 64 34 25 12 22 11 90 

排序后: 11 12 22 25 34 64 90

🔍 注意事项 & 小贴士 🧭

项目 说明
✅ 排序稳定性 是稳定排序(相等元素不会交换)
❌ 时间复杂度 平均和最坏情况是 O(n²),最好情况是 O(n)(加了优化)
⚠️ 适用场景 数据量小或教学演示;不适合大规模数据
🚫 易错点 数组下标越界、忘记减去i导致死循环
🧠 优化建议 添加"提前退出"标志,提高效率

🧩 常见问题解答(FAQ)

Q1:为什么叫"冒泡"排序?

A:因为每次循环都会把最大的数"冒"到最后,像气泡一样从水中升出水面。

Q2:冒泡排序能不能降序排列?

A:当然可以!只需把比较条件改为 arr[j] < arr[j + 1] 即可。

Q3:怎么知道数组已经排好序了?

A:如果在某一轮中没有发生任何交换,说明数组已经是有序的了。

📚 推荐练习题(LeetCode精选)

题号 题目名称 链接
217 存在重复元素 https://leetcode.cn/problems/contains-duplicate/
268 丢失的数字 https://leetcode.cn/problems/missing-number/
169 多数元素 https://leetcode.cn/problems/majority-element/

🎉 总结

🎉 冒泡排序虽然效率不高,但它是最容易理解、最容易实现的排序算法之一。

🧠 掌握它的基本思想和实现方式,有助于你进一步学习更复杂的排序算法,比如快速排序、归并排序等!

📌 别忘了收藏 ❤️+点赞 👍+分享 😄 一键三连,给正在学习算法的小伙伴吧!