c语言——冒泡排序法

文章介绍了如何使用冒泡排序算法,通过for循环对输入的整数序列(如88,25,4,48,9)进行排序。冒泡排序是一种简单但效率低的算法,通过两层循环比较并交换相邻元素,最终达到升序排列。代码示例展示了具体的实现过程,并给出了排序后的结果(4,9,25,48,88)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一、核心排序逻辑

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

  1. 第一轮(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 已到位)
  2. 第二轮(i=1)
    比较前 4 个元素(共 3 次比较),将第二大元素 48 移到倒数第二位:

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

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

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

二、代码细节解析

1. 变量与输入
int i, j, t, a[5];  // 定义循环变量i/j、交换用临时变量t、存储5个元素的数组a
printf("输入数值:\n");
for (i = 0; i < 5; i++)
    scanf("%d,", &a[i]);  // 按逗号分隔输入5个整数(如“88,25,4,48,9”)

  • 数组设计a[5]直接存储 5 个待排序元素,下标从 0 到 4(符合 C 语言数组的 0 基索引习惯)。
  • 输入格式scanf("%d,", &a[i])要求输入以逗号分隔(如多输入一个逗号也可正常读取),若输入其他分隔符(如空格),会导致后续元素读取失败(需严格匹配格式)。
2. 核心排序循环
// 外层循环:控制排序轮次(共4轮,i=0到3)
for (i = 0; i < 5; i++)
    // 内层循环:每轮比较相邻元素,未排序部分长度随i增大而减少
    for (j = 0; j < 5 - i - 1; j++)  // 5-i-1:每轮减少1次比较(已排序元素无需再比较)
    {
        if (a[j] > a[j + 1])  // 若当前元素大于下一个元素,交换位置
        {
            t = a[j];          // 临时存储当前元素
            a[j] = a[j + 1];   // 下一个元素前移
            a[j + 1] = t;      // 当前元素后移(实现交换)
        }
    }
  • 外层循环(i):共执行 4 次(i=03),因为 5 个元素排序需要 4 轮(每轮确定 1 个最大元素的位置)。
  • 内层循环(j)
    • 每轮比较次数为5 - i - 1(如i=0时比较 4 次,i=1时比较 3 次),原因是每轮结束后,末尾i个元素已排序,无需再比较。
    • 交换逻辑:通过临时变量t实现两个元素的交换,确保较大的元素 “后移”,这是冒泡排序的核心操作。
3. 输出排序结果
printf("排序后的顺序是:\n");
for (i = 0; i < 5; i++)
    printf("%d ", a[i]);  // 依次打印排序后的数组元素(空格分隔)
  • 遍历数组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)或教学演示,不适合大规模数据(如数据库排序、海量日志排序)。

四、优化建议

为提升冒泡排序的效率,可添加提前退出机制(当某轮未发生交换时,说明数组已有序,直接结束排序):

int swapped;  // 标记本轮是否发生交换
for (i = 0; i < 5; i++)
{
    swapped = 0;  // 初始化标记为0(未交换)
    for (j = 0; j < 5 - i - 1; j++)
    {
        if (a[j] > a[j + 1])
        {
            // 交换操作(同上)
            t = a[j];
            a[j] = a[j + 1];
            a[j + 1] = t;
            swapped = 1;  // 发生交换,标记为1
        }
    }
    if (swapped == 0)  // 若本轮未交换,说明数组已有序,提前退出
        break;
}
  • 优化效果:对于已排序的数组(如[1,2,3,4,5]),仅需 1 轮比较(4 次)就会退出,而非 4 轮,大幅减少不必要的操作。

冒泡排序法
设定数值:88,25,4,48,9,利用for循环实现排序

冒泡排序算法来对一组整数进行排序。冒泡排序是一种简单但较慢的排序算法,它通过多次遍历数组,比较相邻的元素,并根据需要交换它们的位置,直到整个数组按升序排列为止。

在代码中,你声明了一个大小为6的整数数组a,然后使用for循环依次输入5个整数。接下来,使用两个嵌套的for循环来执行冒泡排序。外部的for循环控制每次遍历的次数,内部的for循环用于比较相邻元素并进行交换。通过一个临时变量t来实现交换操作。

最后,使用for循环打印排序后的数组。

根据你提供的示例输入88, 25, 4, 48, 9,根据代码逻辑,输出的结果应该是4, 9, 25, 48, 88。这表示输入的整数按照升序进行了排序。

冒泡排序是一个简单但效率较低的排序算法,如果待排序的数组规模较大,可能会耗费较长的时间。对于更大规模的排序任务,你可能需要使用更快速的排序算法,如快速排序、归并排序等。

//冒泡排序法
//设定数值:88,25,4,48,9,利用for循环实现排序
#include<stdio.h>
int main()
{
    int i, j, t, a[5];
    printf("输入数值:\n");
    for (i = 0; i < 5; i++)
        scanf("%d,", &a[i]);
    for (i = 0; i < 5; i++)
        for (j = 0; j < 5 - i - 1; j++)
        {
            if (a[j] > a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    printf("排序后的顺序是:\n");
    for (i = 0; i < 5; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}
 //输出数值:88,25,4,48,9
 //输出结果:4,9,25,48,88 

这段代码是一个简单的冒泡排序算法实现,以下是对代码的详细分析:

  1. 首先,定义了一个整型变量数组 a,以及用于交换元素的临时变量 t
  2. 然后,使用 printf 函数输出提示信息 “输入数值:”,提示用户输入五个整数。
  3. 使用 for 循环依次读取用户输入的五个整数,并存储到数组 a 中。
  4. 嵌套使用两个 for 循环,进行冒泡排序的过程。外层循环 i 控制需要进行比较的轮次,内层循环 j 控制每一轮的比较次数。
  5. 在每一轮的比较中,使用 if 条件语句判断当前元素 a[j] 是否大于下一个元素 a[j+1],如果是则进行交换操作,将较大的数移到后面。
  6. 排序完成后,使用 printf 函数输出排序后的结果,即数组 a 中的元素。
  7. 最后使用 return 0 语句结束 main 函数。

### C语言实现冒泡排序并测试于PTA平台 在C语言中,可以通过编写特定的函数来实现冒泡排序算法,并可以在PTA平台上进行验证。下面是一个完整的程序实例,该实例展示了如何接收一组整数作为输入,对其进行升序排列,并最终打印出已排序的结果。 #### 完整代码示例解析 ```c #include <stdio.h> void sort(int b[], int n); int main() { void sort(int b[], int n); int n, i; int a[100] = {0}; // 输入待排序数组长度以及具体数值 scanf("%d", &n); for (i = 0; i < n; ++i) { scanf("%d", &a[i]); } // 调用自定义的sort函数执行冒泡排序操作 sort(a, n); // 输出经过排序后的数组元素 for (i = 0; i < n; ++i) { printf("%4d", a[i]); } printf("\n"); } // 冒泡排序的具体逻辑封装在此处 void sort(int b[], int n) { int i, j, t; for (i = 0; i < n - 1; ++i) { for (j = 0; j < n - i - 1; ++j) { if (b[j] > b[j + 1]) { // 如果前一项大于后一项,则交换两者位置 t = b[j]; b[j] = b[j + 1]; b[j + 1] = t; } } } } ``` 上述代码实现了基本的冒泡排序功能[^2]。`main()` 函数负责处理用户的输入和输出;而 `sort()` 则包含了实际用于排序的核心算法——即两层嵌套循环遍历整个列表,并逐次比较相邻两个元素大小关系,在必要时互换它们的位置直到完成全部序列的有序化调整为止。 当提交至PTA评测系统时,请确保遵循题目指定的数据范围和其他约束条件,比如最大允许使用的内存空间或时间复杂度上限等要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张謹礧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值