下面是冒泡排序的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]) {
// 交换 arr[j] 和 arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 优化版冒泡排序(添加交换标志位)
void optimizedBubbleSort(int arr[], int n) {
int swapped;
for (int i = 0; i < n - 1; i++) {
swapped = 0; // 重置标志
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换 arr[j] 和 arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1; // 标记发生了交换
}
}
// 如果本轮没有交换,说明已经有序,提前结束
if (swapped == 0) break;
}
}
// 测试代码
int main() {
int arr[] = {5, 2, 4, 1, 3};
int n = sizeof(arr) / sizeof(arr[0]);
// 使用基础冒泡排序
// bubbleSort(arr, n);
// 使用优化版冒泡排序
optimizedBubbleSort(arr, n);
printf("排序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
代码解释:
- 基础版本:通过两层循环,外层控制轮数(共n-1轮),内层比较相邻元素并交换。
- 优化版本:添加
swapped
标志位,若某轮未发生交换则提前结束,避免无效遍历。
复杂度分析:
- 时间复杂度:最坏情况O(n²),最好情况(已排序)O(n)(仅优化版)。
- 空间复杂度:O(1)(原地排序)。