定义

冒泡排序(Bubble Sort)是一种简单的 原地 比较排序算法:反复对相邻元素 两两比较,逆序则交换,使元素像气泡一样逐步「冒」向区间一端,故称为冒泡排序。

特性:平均 · 最好 · 最坏 · 空间 · 原地 · 稳定

过程

共进行至多 趟扫描。每趟沿固定方向遍历 未排序 区间,相邻元素两两比较并交换,使目标极值逐步换至区间一端;一趟结束后,该端元素就位,即为当前未排序部分的极值。

冒泡排序动画

性质

稳定性

冒泡排序是 稳定 排序算法。仅在相邻两元素前者严格大于后者时才交换,相等元素不会互换位置,相对顺序保持不变。

时间复杂度

情况复杂度说明
最好已有序时,一趟扫描无交换即可结束
最坏逆序时约 次比较与交换
平均随机数据下比较次数同阶

空间复杂度

。原地排序,仅使用常数个辅助变量。

代码实现

flag 控制是否继续扫描:每趟开始前置为 false,扫描中一旦发生交换便置为 true;若整趟结束仍为 false,说明序列已有序,提前退出循环:

static void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
 
void bubble_sort(int* arr, int len) {
    if (len <= 1) return;
 
    bool flag = true;
    while (flag) {
        flag = false;
        for (int i = 0; i < len - 1; i++) {
            if (arr[i] > arr[i + 1]) {
                flag = true;
                swap(arr + i, arr + i + 1);
            }
        }
    }
}

参考阅读