# 冒泡排序（Bubble Sort）

URL: https://caijiao.org/sort/1-bubble-sort
Source: docs/sort/1-bubble-sort.md
Description: 冒泡排序是一种基础且易懂的排序算法，适合小规模数据排序。本文提供冒泡排序的算法原理与 JavaScript、Python、C++、Java、PHP、Go 多语言示例代码

冒泡排序是一种简单的**比较类排序算法**，通过重复交换相邻元素，将较大的元素逐步“冒泡”到序列末尾。

算法核心思想是**多次遍历数组，每次比较相邻元素并交换，直到序列有序**。

## 📌 算法原理解释

- 对数组进行多轮遍历；
- 每轮将相邻元素两两比较，如果前者大于后者则交换；
- 每轮遍历后，最大的元素移动到当前未排序序列末尾；
- 重复直到所有元素排序完成。

冒泡排序的时间复杂度最坏和平均均为 O(n²)，但当数据近乎有序时，最好情况下可达 O(n)。

## 💻 多语言代码实现


// JavaScript 冒泡排序
function bubbleSort(arr) {
  const n = arr.length;
  for (let i = 0; i < n - 1; i++) {
    let swapped = false;
    for (let j = 0; j < n - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        swapped = true;
      }
    }
    if (!swapped) break; // 优化：提前退出
  }
  return arr;
}
````

```python
# Python 冒泡排序
def bubble_sort(arr):
    n = len(arr)
    for i in range(n - 1):
        swapped = False
        for j in range(n - 1 - i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break
    return arr
```

```cpp
// C++ 冒泡排序
#include <vector>
using namespace std;

void bubbleSort(vector<int>& arr) {
    int n = arr.size();
    bool swapped;
    for (int i = 0; i < n - 1; i++) {
        swapped = false;
        for (int j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}
```

```java
// Java 冒泡排序
public class BubbleSort {
    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;
        for (int i = 0; i < n - 1; i++) {
            swapped = false;
            for (int j = 0; j < n - 1 - i; 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;
        }
    }
}
```

```php
<?php
// PHP 冒泡排序
function bubbleSort(array &$arr): array {
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        $swapped = false;
        for ($j = 0; $j < $n - 1 - $i; $j++) {
            if ($arr[$j] > $arr[$j + 1]) {
                [$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
                $swapped = true;
            }
        }
        if (!$swapped) break;
    }
    return $arr;
}
?>
```

```go
// Go 冒泡排序
package main

func bubbleSort(arr []int) []int {
    n := len(arr)
    for i := 0; i < n-1; i++ {
        swapped := false
        for j := 0; j < n-1-i; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
                swapped = true
            }
        }
        if !swapped {
            break
        }
    }
    return arr
}
```


## ✅ 算法特点与总结

| 属性     | 描述                  |
| ------ | ------------------- |
| 时间复杂度  | 最坏/平均 O(n²)，最好 O(n) |
| 空间复杂度  | O(1)（原地排序）          |
| 稳定性    | ✅ 稳定                |
| 是否原地排序 | ✅ 是                 |

> 📌 提示：冒泡排序适合教学、少量数据排序，实际大规模数据推荐更高效算法。
