C语言插入排序及其优化

插入排序算法详解

插入排序是一种简单直观的排序算法。它通过构建有序序列,将未排序部分的元素插入到已排序部分的正确位置,直到所有元素排序完成。下面是插入排序的关键点及其实现细节。


算法思想

  1. 从第二个元素(下标为 1)开始,假定左侧的子数组已排序。
  2. 将当前元素与已排序部分逐一比较,找到插入点。
  3. 将插入点后的元素依次后移,为当前元素腾出位置。
  4. 重复上述过程,直至所有元素排序完成。

直接插入法排序

复制代码
void insert_sort(int array[], int size) {
    for (int i = 1; i < size; i++) {
        int temp = array[i]; // 当前待插入的元素
        int j = i - 1;

        // 查找插入位置
        while (j >= 0 && temp < array[j]) {
            array[j + 1] = array[j]; // 元素后移
            j--;
        }
        array[j + 1] = temp; // 插入元素
    }
}

优化方法

插入排序的主要时间消耗来源于:

  1. 查找插入位置的比较操作。
  2. 元素后移的赋值操作。

可以通过以下方法进行优化:

二分插入法排序

复制代码
#include <stdio.h>

void insert_sort(int array[], int size) {
    for (int i = 1; i < size; i++) {
        int temp = array[i];
        int left = 0, right = i - 1;

        // 二分查找插入位置
        while (left <= right) {
            int mid = (left + right) / 2;
            if (array[mid] > temp)
                right = mid - 1;
            else
                left = mid + 1;
        }

        // 将大于 temp 的元素右移
        for (int j = i - 1; j >= left; j--) {
            array[j + 1] = array[j];
        }
        array[left] = temp; // 插入到正确位置
    }
}

时间复杂度分析

操作 最好情况(数组已排序) 最坏情况(数组逆序) 平均情况
比较次数 O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)
移动次数 O(n)O(n)O(n) O(n2)O(n^2)O(n2) O(n2)O(n^2)O(n2)

尽管插入排序在最坏情况下的复杂度是 O(n2)O(n^2)O(n2),但在以下情况下表现良好:

  1. 数据接近有序时,比较和移动次数大幅减少。
  2. 数据量较小时,插入排序的简单性使其执行速度不逊于复杂的排序算法。
相关推荐
草莓熊Lotso2 分钟前
【C++】递归与迭代:两种编程范式的对比与实践
c语言·开发语言·c++·经验分享·笔记·其他
Aczone281 小时前
硬件(六)arm指令
开发语言·汇编·arm开发·嵌入式硬件·算法
luckys.one5 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|7 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师7 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo37 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
鹿鹿学长8 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
好家伙VCC8 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
伴杯猫8 小时前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github
liulilittle10 小时前
IP校验和算法:从网络协议到SIMD深度优化
网络·c++·网络协议·tcp/ip·算法·ip·通信