C语言---排序算法3---插入排序法

文章目录

插入排序是一种简单但高效的排序算法,尤其适合小规模或基本有序的数据。其核心思想通过"逐个插入"维护有序序列,具有稳定性和低空间复杂度的优势。在实际应用中,可结合二分查找或分组策略(如希尔排序)进一步优化性能。

算法原理

插入排序是一种基于比较的简单排序算法,其核心思想类似于整理扑克牌:

1、将数组分为已排序和未排序两部分。

2、从未排序部分依次取出元素,在已排序部分中找到合适的位置插入。

3、重复上述过程,直到所有元素有序。

代码实现

bash 复制代码
#include <stdio.h>

// 插入排序函数
void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) { // 从第二个元素开始(i=1)
        int key = arr[i]; // 当前待插入元素
        int j = i - 1;    // 已排序部分的最后一个元素索引

        // 将比 key 大的元素向后移动
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }

        // 插入 key 到正确位置
        arr[j + 1] = key;
    }
}

// 测试代码
int main() {
    int arr[] = {12, 11, 13, 5, 6};
    int n = sizeof(arr) / sizeof(arr[0]);

    insertionSort(arr, n);
    printf("排序结果: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

执行过程示例

以数组 [5, 2, 4, 6, 1] 为例:

bash 复制代码
初始数组: [5, 2, 4, 6, 1]
第1轮 (i=1, key=2):
  - 比较 5 > 2 → 移动 5 → [5, 5, 4, 6, 1]
  - 插入 2 → [2, 5, 4, 6, 1]
第2轮 (i=2, key=4):
  - 比较 5 > 4 → 移动 5 → [2, 5, 5, 6, 1]
  - 比较 2 <= 4 → 插入 4 → [2, 4, 5, 6, 1]
第3轮 (i=3, key=6):
  - 5 <= 6 → 直接插入 → [2, 4, 5, 6, 1]
第4轮 (i=4, key=1):
  - 比较 6 > 1 → 移动 6 → [2, 4, 5, 6, 6]
  - 比较 5 > 1 → 移动 5 → [2, 4, 5, 5, 6]
  - 比较 4 > 1 → 移动 4 → [2, 4, 4, 5, 6]
  - 比较 2 > 1 → 移动 2 → [2, 2, 4, 5, 6]
  - 插入 1 → [1, 2, 4, 5, 6]

特点

原地排序:仅需常数级额外空间(O(1))。

稳定排序:相同元素的相对位置不变(如 [5, 2, 5, 1] 中两个 5 的顺序不变)。

时间复杂度:

最优:O(n)(输入已有序时)。

最差:O(n²)(输入逆序时)。

平均:O(n²)。

优缺点对比

优点 缺点
实现简单,代码直观 时间复杂度较高(O(n²))
稳定排序(不改变相同元素顺序) 不适合大规模数据排序
对小规模或基本有序数据高效 需要较多元素移动操作
空间复杂度低(O(1)) 性能不如快速排序、归并排序等高级算法

适用场景

1、小规模数据排序(如 n < 1000)。

2、基本有序的数据(如接近有序的数组,时间复杂度接近 O(n))。

3、在线算法(数据逐个到达时动态维护有序序列)。

4、教学示例(理解排序算法的基本思想)。

相关推荐
颜酱6 小时前
单调栈:从模板到实战
javascript·后端·算法
是希燃亚8 小时前
📚 十大经典排序算法 C语言笔记(一看就会版)
排序算法
CoovallyAIHub10 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub10 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
祈安_11 小时前
C语言内存函数
c语言·后端
NAGNIP21 小时前
轻松搞懂全连接神经网络结构!
人工智能·算法·面试
NAGNIP21 小时前
一文搞懂激活函数!
算法·面试