# 插入排序（Insertion Sort）

URL: https://caijiao.org/sort/3-insertion-sort
Source: docs/sort/3-insertion-sort.md
Description: 插入排序是一种简单且高效的排序算法，适合部分有序数组排序。本文介绍算法原理，并提供 JavaScript、Python、C++、Java、PHP、Go 多语言示例代码。

插入排序是一种**比较类排序算法**，通过构建有序序列，对于未排序元素，逐个插入到已排序部分的正确位置。

## 📌 算法原理解释

- 从第 2 个元素开始，取出当前元素；
- 与已排序部分从后向前比较，找到合适插入位置；
- 将元素插入到该位置，保证已排序部分有序；
- 重复直到所有元素排序完成。

插入排序对部分有序数组效率较高，最好时间复杂度为 O(n)。

## 💻 多语言代码实现


// JavaScript 插入排序
function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let key = arr[i];
    let j = i - 1;
    while (j >= 0 && arr[j] > key) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = key;
  }
  return arr;
}
````

```python
# Python 插入排序
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr
```

```cpp
// C++ 插入排序
#include <vector>
using namespace std;

void insertionSort(vector<int>& arr) {
    int n = arr.size();
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}
```

```java
// Java 插入排序
public class InsertionSort {
    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
}
```

```php
<?php
// PHP 插入排序
function insertionSort(array &$arr): array {
    $n = count($arr);
    for ($i = 1; $i < $n; $i++) {
        $key = $arr[$i];
        $j = $i - 1;
        while ($j >= 0 && $arr[$j] > $key) {
            $arr[$j + 1] = $arr[$j];
            $j--;
        }
        $arr[$j + 1] = $key;
    }
    return $arr;
}
?>
```

```go
// Go 插入排序
package main

func insertionSort(arr []int) []int {
    for i := 1; i < len(arr); i++ {
        key := arr[i]
        j := i - 1
        for j >= 0 && arr[j] > key {
            arr[j+1] = arr[j]
            j--
        }
        arr[j+1] = key
    }
    return arr
}
```


## ✅ 算法特点与总结

| 属性     | 描述                  |
| ------ | ------------------- |
| 时间复杂度  | 最坏/平均 O(n²)，最好 O(n) |
| 空间复杂度  | O(1)（原地排序）          |
| 稳定性    | ✅ 稳定                |
| 是否原地排序 | ✅ 是                 |

> 📌 提示：插入排序适合部分有序或小规模数据排序，简单且性能良好。
