每日一个经典算法详解,今天从最基础的冒泡排序开始,图文+代码带你彻底搞懂排序原理。
一、什么是冒泡排序?
冒泡排序(Bubble Sort)是一种基于交换的排序算法,其核心思想是:
通过不断比较相邻元素,将较大元素逐步"浮"到数组末端,如同水中气泡上浮的过程。
算法特性:
-
稳定排序(相等元素不改变顺序)
-
时间复杂度:O(n²)(最坏/平均)
-
空间复杂度:O(1)(原地排序)
二、算法原理详解
具体步骤分解:
-
从数组第一个元素开始,比较相邻的两个元素
-
如果前一个元素 > 后一个元素,交换它们的位置
-
对每一对相邻元素重复上述操作,直到数组末尾
-
完成一轮后,最后一个元素即为最大值
-
对剩余未排序部分重复步骤1-4,直到整个数组有序
三、C++代码实现
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; ++i) { // 外层循环控制轮次
bool swapped = false; // 优化标记
for (int j = 0; j < n-i-1; ++j) { // 内层循环进行冒泡
if (arr[j] > arr[j+1]) {
swap(arr[j], arr[j+1]);
swapped = true;
}
}
if (!swapped) break; // 本轮无交换说明已有序,提前终止
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
cout << "排序结果:";
for (int i = 0; i < n; ++i) {
cout << arr[i] << " ";
}
return 0;
}
代码解析:
-
双重循环结构:外层控制排序轮次,内层执行冒泡操作
-
优化设计:
swapped
标记可提前终止已有序序列的无效比较 -
n-i-1
的意义:每轮排序后末尾i个元素已有序,无需再比较
四、实例演算
以数组[5, 3, 8, 2]
为例:
轮次 | 比较操作 | 当前数组状态 |
---|---|---|
初始 | - | 5 3 8 2 |
第1轮 | 5↔3, 5↔8, 8↔2 | 3 5 2 8 |
第2轮 | 3↔5, 5↔2 | 3 2 5 8 |
第3轮 | 3↔2 | 2 3 5 8 |
五、复杂度分析
情况 | 时间复杂度 | 空间复杂度 |
---|---|---|
最坏情况 | O(n²) | O(1) |
最好情况 | O(n) | O(1) |
平均情况 | O(n²) | O(1) |
适用场景: 小规模数据排序或教学演示