| 上一篇 | 下一篇 |
|---|---|
| 队列 |
目 录
-
- [1)冒泡排序(Bubble Sort)](#1)冒泡排序(Bubble Sort))
-
- 1.1)算法步骤
- 1.2)时间与空间复杂度
- [1.3)C 语言代码示例](#1.3)C 语言代码示例)
1)冒泡排序(Bubble Sort)
冒泡排序通过 多次遍历数组,比较相邻元素 ,若顺序错误(如升序情况下,前 > 后)则交换。每一轮遍历会 将当前未排序部分中的最大值 "冒泡" 到末尾。重复此过程,直到整个数组有序。特点是:简单直观、稳定、原地排序。
1.1)算法步骤
- 从索引
0开始,比较arr[i]和arr[i+1]; - 升序要求下,如果
arr[i] > arr[i+1],交换两者; - 继续向后比较,直到倒数第二个元素;
- 第一轮结束后,最大元素已在最后;
- 对前
n-1个元素重复上述过程; - 若某轮未发生任何交换,说明数组已有序,可提前终止(优化)。
1.2)时间与空间复杂度
| 情况 | 时间复杂度 |
|---|---|
| 最好(已有序) | O(n)(需优化) |
| 平均 | O(n²) |
| 最坏(逆序) | O(n²) |
- 空间复杂度:O(1)(原地排序)
- 稳定性:✔️ 稳定(相等元素不交换)
1.3)C 语言代码示例
c
#include <stdio.h>
/**
* @brief: bubble_sort ------ 冒泡排序函数(升序)
* @note: n - 输入数组长度
*/
void bubble_sort(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])
{
// 交换 arr[j] 和 arr[j+1]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
// 如果本轮没有交换,说明已有序,提前退出
if (!swapped)
break;
}
}
// 打印数组
void print_array(int arr[], int n)
{
for (int i=0; i<n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
/* 主函数:测试冒泡排序 */
int main()
{
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: ");
print_array(arr, n);
bubble_sort(arr, n);
printf("排序后数组: ");
print_array(arr, n);
return 0;
}
运行结果如下:
原始数组: 64 34 25 12 22 11 90
排序后数组: 11 12 22 25 34 64 90