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; } }

常见问题