冒泡排序标准代码(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) | 不稳定 | 小数据量 |
重点总结
- 核心思想:通过相邻元素比较和交换,使较大值逐渐"浮"到数组右侧。
- 代码要点 :
- 双循环嵌套结构
- 内层循环范围随轮次缩小(
n-1-i
) - 可添加标志位优化提前退出
- 学习建议 :
- 用纸笔模拟排序过程(如输入
[7,3,5,1,9]
) - 对比不同数据量下的性能差异
- 尝试修改为降序排序
- 用纸笔模拟排序过程(如输入