插入排序的基本原理

插入排序是一种简单直观的排序算法,适合小规模数据或部分有序的数据集。其核心思想是通过构建有序序列,对未排序的数据逐个插入到已排序序列的适当位置。算法在实现上通常采用原地排序(即不使用额外空间),时间复杂度为 $O(n^2)$,空间复杂度为 $O(1)$。

算法步骤描述

  1. 初始化
    从数组的第二个元素开始遍历,假设第一个元素已经是有序序列。

  2. 比较与插入
    当前元素与已排序序列从后向前比较,找到合适位置后插入。若当前元素小于已排序元素,则将已排序元素向后移动一位,直到找到插入点。

  3. 重复操作
    对所有未排序元素重复上述过程,直到整个数组有序。

Python 代码实现

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 示例
array = [12, 11, 13, 5, 6]
print("排序前:", array)
print("排序后:", insertion_sort(array))

C++ 代码实现

#include <iostream>
using namespace std;

void insertionSort(int arr[], int n) {
    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;
    }
}

// 示例
int main() {
    int arr[] = {12, 11, 13, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    insertionSort(arr, n);
    cout << "排序后: ";
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    return 0;
}

时间复杂度分析

  • 最优情况:数组已有序时,仅需 $O(n)$ 时间(每次比较一次即停止)。
  • 最差情况:数组逆序时,需 $O(n^2)$ 时间(每次需移动全部已排序元素)。
  • 平均情况:$O(n^2)$。

适用场景

  • 小规模数据或基本有序的数据集。
  • 需要稳定排序(相同元素相对位置不变)且空间受限的场景。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐