冒泡排序的核心逻辑是重复遍历待排序的数组,每次比较相邻的两个元素,如果它们的顺序不符合排序要求就交换位置,每一轮遍历都会把当前未排序部分的最大元素移动到末尾,经过多轮遍历后整个数组就会变成有序状态。
冒泡排序的基本实现步骤
标准的冒泡排序实现可以分为以下几个步骤:
- 确定外层循环的次数,总共需要遍历数组长度减1次,因为最后一个元素不需要再比较
- 内层循环负责每一轮相邻元素的比较和交换,每一轮结束后,未排序部分的长度会减少1
- 如果某一轮遍历中没有发生任何元素交换,说明数组已经有序,可以提前结束排序
基础版C++冒泡排序代码
下面的代码实现了对整数数组的升序排序,逻辑清晰,适合初学者理解:
#include <iostream>
using namespace std;
// 冒泡排序函数,参数为待排序数组和数组长度
void bubbleSort(int arr[], int n) {
// 外层循环控制遍历轮数,共n-1轮
for (int i = 0; i < n - 1; i++) {
// 内层循环比较相邻元素,每一轮后最大元素已就位,所以到n-i-1即可
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 testArr[] = {64, 34, 25, 12, 22, 11, 90};
int arrLen = sizeof(testArr) / sizeof(testArr[0]);
cout << "排序前的数组:" << endl;
for (int i = 0; i < arrLen; i++) {
cout << testArr[i] << " ";
}
cout << endl;
bubbleSort(testArr, arrLen);
cout << "排序后的数组:" << endl;
for (int i = 0; i < arrLen; i++) {
cout << testArr[i] << " ";
}
cout << endl;
return 0;
}
优化版冒泡排序实现
基础版的冒泡排序即使数组已经有序,还是会执行完所有轮次的循环,我们可以增加一个标志位来优化这个逻辑:
#include <iostream>
using namespace std;
// 优化版冒泡排序,增加有序标志减少不必要的循环
void optimizedBubbleSort(int arr[], int n) {
bool isSorted;
// 外层循环控制遍历轮数
for (int i = 0; i < n - 1; i++) {
isSorted = true; // 每轮开始假设数组已经有序
// 内层循环比较相邻元素
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;
isSorted = false; // 发生了交换,说明数组还未完全有序
}
}
// 如果本轮没有发生交换,说明数组已经有序,直接退出循环
if (isSorted) {
break;
}
}
}
int main() {
int testArr[] = {11, 12, 22, 25, 34, 64, 90}; // 已经有序的数组
int arrLen = sizeof(testArr) / sizeof(testArr[0]);
cout << "排序前的数组:" << endl;
for (int i = 0; i < arrLen; i++) {
cout << testArr[i] << " ";
}
cout << endl;
optimizedBubbleSort(testArr, arrLen);
cout << "排序后的数组:" << endl;
for (int i = 0; i < arrLen; i++) {
cout << testArr[i] << " ";
}
cout << endl;
return 0;
}
冒泡排序的特性分析
冒泡排序的时间复杂度和空间复杂度如下:
| 指标 | 数值 | 说明 |
|---|---|---|
| 平均时间复杂度 | O(n²) | 需要两层嵌套循环,元素比较和交换次数与数组长度的平方成正比 |
| 最好时间复杂度 | O(n) | 数组已经有序时,优化版冒泡排序只需要遍历一次 |
| 最坏时间复杂度 | O(n²) | 数组完全逆序时,需要完成所有轮次的比较和交换 |
| 空间复杂度 | O(1) | 只使用了常数级的临时变量,属于原地排序算法 |
| 稳定性 | 稳定 | 相等元素不会交换位置,相对顺序不会改变 |
冒泡排序的逻辑简单易懂,适合作为排序算法的入门学习内容,但由于时间复杂度较高,在处理大规模数据时不推荐使用,更适合小规模数据或者几乎已经有序的数据场景。
C++冒泡排序bubble_sort排序算法修改时间:2026-06-20 18:33:36