C++ 冒泡排序算法可视化教学
交互式展示冒泡排序算法的工作原理,通过可视化和代码同步高亮,帮助理解排序过程与代码实现的对应关系。
算法可视化
15
500ms
排序状态
准备就绪。点击"开始排序"按钮开始演示,或使用"单步执行"观察每一步操作。
待比较元素
正在交换
已排序元素
当前执行代码行
C++ 代码解析
排序过程中会高亮显示当前正在执行的代码行:
// 冒泡排序函数
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
// 最后i个元素已经到位
for (int j = 0; j < n-i-1; j++) {
// 从0到n-i-1遍历元素
// 比较相邻元素
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[0]);
bubbleSort(arr, n);
return 0;
}
代码说明
- 外层循环控制排序轮数,每轮确定一个最大元素的位置
- 内层循环负责相邻元素的比较和交换
- 算法时间复杂度为O(n²),空间复杂度为O(1)
算法详细说明
工作原理
冒泡排序的核心思想是通过重复比较相邻的元素并交换它们(如果它们的顺序错误),使最大的元素逐渐"浮"到数组的末端,就像水中的气泡上升一样。
每一轮排序都会确定一个最大元素的位置,因此随着排序的进行,需要比较的元素数量会逐渐减少。
优缺点
优点:
- 实现简单,易于理解
- 不需要额外的存储空间(原地排序)
- 稳定的排序算法(相等元素的相对位置不会改变)
缺点:
- 效率较低,时间复杂度为O(n²)
- 不适合处理大量数据
- 无论数组是否已排序,都需要进行大量比较
排序步骤
步骤 1:初始状态
准备待排序的数组,所有元素均未排序
步骤 2:第一轮比较
从第一个元素开始,依次比较相邻的两个元素,如果它们的顺序错误就交换它们。完成后,最大的元素会被移到数组末尾
步骤 3:后续轮次
忽略已排好序的元素,对剩余元素重复步骤2,直到所有元素都被排序
步骤 4:完成排序
当所有元素都被放置到正确位置时,排序完成
优化版本
可以通过添加一个标志位来优化冒泡排序,如果在某一轮中没有发生任何交换,说明数组已经有序,可以提前结束排序:
void optimizedBubbleSort(int arr[], int n) {
bool swapped;
for (int i = 0; i < n-1; i++) {
swapped = false;
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;
swapped = true;
}
}
// 如果没有发生交换,说明数组已经有序
if (!swapped)
break;
}
}