数据结构-插入排序

1、插入排序

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。

插入排序的算法步骤如下:

  1. 从第一个元素开始,该元素可以认为已经被排序;

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;

  5. 将新元素插入到该位置后;

  6. 重复步骤2~5。

复制代码
#include <stdio.h>
void InsertSort(int* p, int n)
{
    int temp,i,j;
    for (i = 0; i < n; i++)  //每个元素都需要来插入,故比较n次
    {
        temp = p[i];    //设置哨兵,为针对的第i个元素
        for (j = i - 1; (j >= 0) && (p[j] > temp); j--)  //将于哨兵前面的有序元素进行比较,如果要操作也仅仅是后移
        {
            p[j + 1] = p[j];
        }
        p[j + 1] = temp;   //for循环最后会--,所以待插入的位置为j+1
    }

}

int main()
{
    int a[] = { 4,2,5,6,7,8,3,1,9 };
    InsertSort(a,9);
    printf_s("排序后:\n");
    for (int i = 0; i < 9; i++)
    {
        printf_s("%d ", a[i]);
    }

    return 1;
}
复制代码

空间上只需要一个记录辅助空间,所以关键看时间复杂度
平均比较和移动次数约为(n^2)/4,所以时间复杂度为O(n^2)。
其性能要比冒泡和简单选择排序好些

posted @   kkzhang  阅读(279)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示