这段代码是冒泡排序(Bubble Sort) 的经典实现,用于对 5 个整数(示例输入:88, 25, 4, 48, 9)进行升序排序。冒泡排序的核心思想是通过重复比较相邻元素并交换位置,使较大的元素逐步 “浮” 到数组末尾,就像水中的气泡上升一样。以下从核心逻辑、代码细节、优缺点三个方面详细分析:

一、核心排序逻辑


冒泡排序的本质是多轮相邻元素比较与交换,每一轮将当前未排序部分的最大元素 “推” 到末尾。对于示例数据[88, 25, 4, 48, 9],排序过程如下:

第一轮(i=0):
比较所有相邻元素(共 4 次比较),将最大元素 88 移到末尾:

88 和 25 交换 → [25, 88, 4, 48, 9]
88 和 4 交换 → [25, 4, 88, 48, 9]
88 和 48 交换 → [25, 4, 48, 88, 9]
88 和 9 交换 → [25, 4, 48, 9, 88](88 已到位)
第二轮(i=1):
比较前 4 个元素(共 3 次比较),将第二大元素 48 移到倒数第二位:

25 和 4 交换 → [4, 25, 48, 9, 88]
25 和 48 不交换 → 保持
48 和 9 交换 → [4, 25, 9, 48, 88](48 已到位)
第三轮(i=2):
比较前 3 个元素(共 2 次比较),将第三大元素 25 移到中间位:

4 和 25 不交换 → 保持
25 和 9 交换 → [4, 9, 25, 48, 88](25 已到位)
第四轮(i=3):
比较前 2 个元素(共 1 次比较),确认 4 和 9 的顺序(已正确,无需交换)。

最终结果:[4, 9, 25, 48, 88],完成升序排序。

二、代码细节解析


1. 变量与输入
 // 定义数组(存储5个待排序整数)、循环变量、交换用临时变量
    int a[5];
    int i, j, temp;

    // 读取用户输入(按逗号分隔,与原C代码输入格式一致)
    cout << "输入数值:" << endl; // C++的cout,替代C的printf
    for (i = 0; i < 5; i++) {
        cin >> a[i]; // 读取整数
        if (i < 4) {
            cin.ignore(); // 忽略输入中的逗号(仅前4个元素后需要跳过逗号)
        }
    }

  • 数组设计:a[5]直接存储 5 个待排序元素,下标从 0 到 4(符合 C 语言数组的 0 基索引习惯)。
  • 输入格式:scanf("%d,", &a[i])要求输入以逗号分隔(如多输入一个逗号也可正常读取),若输入其他分隔符(如空格),会导致后续元素读取失败(需严格匹配格式)。

2. 核心排序循环

 // 核心冒泡排序逻辑(与原C代码完全一致,确保排序效果相同)
    // 外层循环:控制排序轮次(5个元素需4轮)
    for (i = 0; i < 5; i++) {
        // 内层循环:每轮比较相邻元素,已排序元素不重复比较
        for (j = 0; j < 5 - i - 1; j++) {
            // 若当前元素大于下一个,交换位置(将大元素“浮”到末尾)
            if (a[j] > a[j + 1]) {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }

  • 外层循环(i):共执行 4 次(i=0到3),因为 5 个元素排序需要 4 轮(每轮确定 1 个最大元素的位置)。
  • 内层循环(j):
  • 每轮比较次数为5 - i - 1(如i=0时比较 4 次,i=1时比较 3 次),原因是每轮结束后,末尾i个元素已排序,无需再比较。
  • 交换逻辑:通过临时变量t实现两个元素的交换,确保较大的元素 “后移”,这是冒泡排序的核心操作。

3. 输出排序结果

// 输出排序结果
    cout << "排序后的顺序是:" << endl; // C++的cout,替代C的printf
    for (i = 0; i < 5; i++) {
        cout << a[i] << " "; // 空格分隔输出,示例结果:4 9 25 48 88
    }

遍历数组a,按升序输出排序结果,示例输出为4 9 25 48 88。
三、优缺点与适用场景


优点:

  1. 逻辑简单直观:仅通过嵌套循环和相邻元素交换实现,代码量少,易于理解和调试,适合排序算法入门学习。
  2. 稳定性好:当相邻元素相等时(a[j] == a[j+1]),不会执行交换,因此能保持相等元素的相对顺序(稳定排序)。
  3. 原地排序:无需额外存储空间(仅用 1 个临时变量t),空间复杂度为 O (1)。

缺点:

  1. 效率低:时间复杂度为 O (n²)(n 为元素个数),对于示例中 5 个元素需要 10 次比较(4+3+2+1),但对于大规模数据(如 n=1000),需要约 50 万次比较,效率极低。
  2. 不必要的比较:即使数组已提前排序,代码仍会执行所有轮次的比较(可通过优化解决)。

适用场景:

仅适合小规模数据排序(n < 100)或教学演示,不适合大规模数据(如数据库排序、海量日志排序)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐