当前位置: 首页 > article >正文

C语言实现冒泡排序:从基础到优化全解析

一、什么是冒泡排序?

冒泡排序(Bubble Sort)是一种经典的排序算法,其工作原理非常直观:通过多次比较和交换相邻元素,将较大的元素“冒泡”到数组的末尾。经过多轮迭代,整个数组会变得有序。


二、冒泡排序的核心思想

  1. 比较相邻元素

    • 从数组的起始位置开始,逐个比较相邻的两个元素。
    • 如果顺序不符合(如升序时前一个元素大于后一个元素),则交换两者的位置。
  2. 逐步缩小范围

    • 每一轮结束后,当前未排序部分中最大的元素会移动到正确的位置。
    • 下一轮只需处理前面的未排序部分。

三、冒泡排序的实现步骤

  1. 从数组的第一个元素开始,与相邻元素进行比较。
  2. 如果顺序不对,交换这两个元素。
  3. 每轮操作后,将最大的元素固定在数组的最后。
  4. 重复上述步骤,直到数组完全有序。

四、冒泡排序的 C 语言实现

基本实现

以下是冒泡排序的基本实现代码:

#include <stdio.h>

// 冒泡排序函数
void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        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;
            }
        }
    }
}

// 主函数
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]);
    }
    printf("\n");

    bubbleSort(arr, n);

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

    return 0;
}

五、输入输出示例

输入

数组:[64, 34, 25, 12, 22, 11, 90]

输出

排序前的数组:64 34 25 12 22 11 90
排序后的数组:11 12 22 25 34 64 90


六、复杂度分析

  1. 时间复杂度
    • 最坏情况(完全逆序):( O(n^2) )
    • 最好情况(已排序):( O(n^2) )(未优化情况下)。
  2. 空间复杂度
    • 只使用了常量空间,空间复杂度为 ( O(1) )。
  3. 稳定性
    • 冒泡排序是稳定的,因为它不会改变相等元素的相对顺序。

七、优化冒泡排序

1. 提前终止的优化

在某一轮比较中,如果没有发生交换,说明数组已经有序,可以提前结束排序。

void optimizedBubbleSort(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; // 如果没有发生交换,提前结束
    }
}
2. 双向冒泡排序(鸡尾酒排序)

普通冒泡排序每轮只向一个方向“冒泡”,双向冒泡则在一轮中从两端同时冒泡,缩小范围。

void cocktailSort(int arr[], int n) {
    int swapped = 1;
    int start = 0, end = n - 1;

    while (swapped) {
        swapped = 0;

        // 从左向右冒泡
        for (int i = start; i < end; i++) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                swapped = 1;
            }
        }
        if (!swapped) break;

        swapped = 0;
        end--;

        // 从右向左冒泡
        for (int i = end - 1; i >= start; i--) {
            if (arr[i] > arr[i + 1]) {
                int temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                swapped = 1;
            }
        }
        start++;
    }
}

八、优缺点分析

优点
  1. 实现简单:逻辑直观,代码易于编写和调试。
  2. 稳定性好:不会改变相等元素的相对顺序。
缺点
  1. 效率较低:时间复杂度较高,尤其对于大规模数据不适用。
  2. 优化潜力有限:即使优化后,性能仍不如快速排序或归并排序。

九、冒泡排序的适用场景

  1. 小规模数据排序:当数据量较小时,冒泡排序的性能尚可接受。
  2. 教学与学习:作为入门排序算法,帮助理解排序的基本思想。
  3. 特殊情况下的稳定性需求:当需要保持相等元素的相对顺序时,可优先选择冒泡排序。

十、总结与建议

冒泡排序作为最基础的排序算法,尽管效率较低,但其直观的实现方式非常适合初学者学习和理解排序算法的核心思想。在实际应用中,建议结合优化方法(如提前终止、双向冒泡)以提升性能。

下一步学习方向

  1. 探索其他排序算法(如插入排序、选择排序、快速排序)。
  2. 理解排序算法的稳定性和复杂度,选择合适的算法解决实际问题。
  3. 实现冒泡排序的多种语言版本(如 Python、Java)。

http://www.kler.cn/a/411430.html

相关文章:

  • HTTP头字段X-Forwarded-For,Proxy-Client-IP,WL-Proxy-Client-IP
  • spf算法、三类LSA、区间防环路机制/规则、虚连接
  • Python绘制太极八卦
  • python VS c++
  • CentOS环境上离线安装python3及相关包
  • 使用java模拟记录软件免费试用次数
  • 电话机器人是什么?
  • node.js @ffmpeg-installer/ffmpeg 桌面推流
  • 安装 electron 依赖报错
  • Flutter 3.24.5安装配置——2024年11月26日
  • OpenCV从入门到精通实战(五)——dnn加载深度学习模型
  • 股指期货交割日为啥会大跌?
  • SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ
  • 【青牛科技】 D2822M 双通道音频功率放大电路芯片介绍,用于便携式录音机和收音机作音频功率放大器
  • 英伟达发布 Edify 3D 生成模型,可以在两分钟内生成详细的、可用于生产的 3D 资源、生成有组织的 UV 贴图、4K 纹理和 PBR 材质。
  • 【大语言模型】ACL2024论文-21 通过冗余减少加快视觉条件语言生成的训练
  • 销售数据分析怎么做?
  • 【离散数学】关系闭包运算的性质
  • Ubuntu下的Graphviz的基础使用方法
  • php CURL请求502
  • 能源电力企业安全数据内外网文件交换
  • Git——本地仓库链接并推送到多个远程仓库
  • 汽车网络安全渗透测试
  • 一个十字翻转小游戏
  • D80【 python 接口自动化学习】- python基础之HTTP
  • MyBatis框架介绍、部署及使用