排序算法:冒泡排序

冒泡排序标准代码(C语言)

c复制代码

复制代码
#include <stdio.h>

// 冒泡排序函数
void bubbleSort(int arr[], int n) {
    // 外层循环:控制排序轮数
    for (int i = 0; i < n - 1; i++) {
        // 内层循环:控制每轮比较次数
        for (int j = 0; j < n - 1 - i; 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);

    bubbleSort(arr, n);

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

核心逻辑分步解析

1. 外层循环 for (i = 0; i < n-1; i++)
  • 作用:控制排序轮数
  • 循环次数n-1 次(例如7个元素需要6轮)
  • 原理:每轮确定一个最大值的位置
2. 内层循环 for (j = 0; j < n-1-i; j++)
  • 作用:执行相邻元素比较

  • 比较次数 :每轮减少i次(已排序部分无需再比较)

  • 示例 (初始数组 [5,3,8,6]):

    轮次 比较范围 具体操作
    i=0 j从0到3 比较全部4对元素
    i=1 j从0到2 比较前3对元素
    i=2 j从0到1 比较前2对元素
3. 元素交换逻辑

c复制代码

复制代码
if (arr[j] > arr[j+1]) {
    int temp = arr[j];
    arr[j] = arr[j+1];
    arr[j+1] = temp;
}
  • 可视化过程 (以 [5,3,8,6] 为例):

    复制代码

    复制代码
    初始 → [5,3,8,6]
    第1轮 → [3,5,6,8](8归位)
    第2轮 → [3,5,6,8](6已正确)
    第3轮 → [3,5,6,8](无交换,排序完成)

时间复杂度分析

情况 时间复杂度 说明
最坏情况 O(n²) 完全逆序(如 9,8,7,6
平均情况 O(n²) 一般随机数据
最好情况 O(n) 已排序(通过优化可实现)

优化版冒泡排序

增加标志位检测是否已提前有序:

c复制代码

复制代码
void optimizedBubbleSort(int arr[], int n) {
    for (int i = 0; i < n-1; i++) {
        int swapped = 0; // 标志位
        for (int j = 0; j < n-1-i; 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; // 本轮无交换说明已有序
    }
}

与其他排序算法对比

算法 平均时间复杂度 空间复杂度 稳定性 适用场景
冒泡排序 O(n²) O(1) 稳定 小数据量或教学用途
快速排序 O(n log n) O(log n) 不稳定 大规模数据
插入排序 O(n²) O(1) 稳定 基本有序的数据
选择排序 O(n²) O(1) 不稳定 小数据量

重点总结

  1. 核心思想:通过相邻元素比较和交换,使较大值逐渐"浮"到数组右侧。
  2. 代码要点
    • 双循环嵌套结构
    • 内层循环范围随轮次缩小(n-1-i
    • 可添加标志位优化提前退出
  3. 学习建议
    • 用纸笔模拟排序过程(如输入 [7,3,5,1,9]
    • 对比不同数据量下的性能差异
    • 尝试修改为降序排序
相关推荐
集芯微电科技有限公司3 分钟前
替代HT6310/KP3310离线式AC-DC无感线性稳压器
数据结构·人工智能·单片机·嵌入式硬件·fpga开发
释怀°Believe5 分钟前
Daily算法刷题【面试经典150题-7️⃣位运算/数学/】
算法·面试·职场和发展
2401_8762213415 分钟前
因数个数、因数和、因数积
c++·算法
云里雾里!25 分钟前
LeetCode 744. 寻找比目标字母大的最小字母 | 从低效到最优的二分解法优化
算法·leetcode
yuanmenghao26 分钟前
CAN系列 — (8) 为什么 Radar Object List 不适合“直接走 CAN 信号”
网络·数据结构·单片机·嵌入式硬件·自动驾驶·信息与通信
一条大祥脚40 分钟前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_7806698642 分钟前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list
二狗哈44 分钟前
czsc入门5: Tick RawBar(原始k线) NewBar (新K线)
算法·czsc
꧁Q༒ོγ꧂1 小时前
算法详解(四)--排序与离散化
数据结构·算法·排序算法
Tisfy1 小时前
LeetCode 0865.具有所有最深节点的最小子树:深度优先搜索(一次DFS + Python5行)
算法·leetcode·深度优先·dfs·题解