📘冒泡排序

2026-09-07
⭐ GESP 2级

📖概念讲解

冒泡排序是最基础的交换排序算法,核心思想是相邻元素两两比较,把大的往后"冒泡"。每一轮会把当前未排序部分的最大值推到末尾。

💡 核心机制:外层控制轮数(n-1轮),内层逐个比较相邻元素,如果前一个比后一个大就交换。优化版:如果某一轮没有发生任何交换,说明已经有序,可以提前结束。

时间复杂度:最坏 O(n²),最好(优化版)O(n),平均 O(n²)。空间复杂度 O(1),是原地排序。

💻代码示例

1#include <iostream>
2using namespace std;
3
4int main() {
5 int a[] = {5, 3, 8, 1, 2}; // 待排序数组
6 int n = 5; // 数组长度
7
8 for (int i = 0; i < n - 1; i++) { // 外层:控制比较轮数,共 n-1 轮
9 for (int j = 0; j < n - 1 - i; j++) { // 内层:比较相邻元素,末尾已排好不用比较
10 if (a[j] > a[j + 1]) { // 如果前面的比后面的大
11 int tmp = a[j]; // 交换 a[j] 和 a[j+1]
12 a[j] = a[j + 1];
13 a[j + 1] = tmp;
14 }
15 }
16 }
17
18 for (int i = 0; i < n; i++) cout << a[i] << " "; // 输出排序结果
19 return 0;
20}
21// 输出:1 2 3 5 8

🧩互动小测

Question 1:冒泡排序内层循环的上界为什么是 n-1-i 而不是 n-1?

Question 2:对数组 {4, 2, 5, 1, 3} 做冒泡排序,第一轮结束后数组变成什么?

Question 3:冒泡排序是稳定排序吗?

🏋️动手练一练

📝 编程练习

题目:给定一个长度为 n 的整数数组,用冒泡排序将其从小到大排列,然后输出排序过程中交换的总次数。

输入:第一行一个整数 n,第二行 n 个整数。
输出:交换的总次数。

样例输入:5\n5 3 8 1 2
样例输出:7

提示:在交换时加一个计数器,每次 swap 时 +1。
参考答案:
#include <iostream>
using namespace std;

int main() {
    int n, a[105];
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];

    int cnt = 0;  // 交换次数计数器
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j + 1]) {
                int tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
                cnt++;  // 每交换一次计数+1
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

要点:冒泡排序的交换次数就是逆序对的数量。对于 {5,3,8,1,2},逆序对有 (5,3)(5,1)(5,2)(3,1)(3,2)(8,1)(8,2) 共 7 对。

📝易错点提醒

学完这个知识点后点一下