直接插入排序:算法界的“老好人”

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


前言

插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因此它在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为新元素提供插入空间。


内容

思想

想象一下,你正在整理一叠扑克牌,你想要按照花色和数字顺序把它们排好。你已经排好了一部分,现在手里还有几张牌需要插入。这就是直接插入排序的精髓——你已经有了一个有序的小序列,现在要将剩余的元素插入到这个序列中,直到整个序列都有序。

动图演示

在这里插入图片描述

步骤分析

  • 步骤一:有序的开始
    就像你在整理扑克牌时,你已经有了一个有序的小序列,直接插入排序也是从一个有序的小数组开始的。这个小数组可以是空的,或者包含一个元素,这取决于你怎么看待“有序”。

  • 步骤二:插入新元素
    现在,你手里拿着一张新牌(数组中的下一个元素),你的眼睛在已经排好的牌上扫过,寻找这张新牌应该插入的位置。这个过程,我们称之为“插入”。

  • 步骤三:保持队形
    找到位置后,你得小心翼翼地将新牌插入,同时确保不打乱已经排好的牌。这就像是在不触碰其他牌的情况下,将一张牌滑入它们之间。

  • 步骤四:重复,直到完美
    你继续这个过程,直到所有的牌都被插入。最后,你得到了一副完美排序的牌,这就像是直接插入排序最终得到一个完全有序的数组。

插入排序的特点

  • 稳定性: 插入排序是稳定的排序算法,即相等的元素在排序后仍然保持相对顺序不变。
  • 效率: 在最好的情况下(即原始数组已经是有序的),插入排序的时间复杂度为O(n),因为每次插入操作只需要比较一次。在最坏的情况下(即原始数组是逆序的),时间复杂度为O(n^2),因为每次插入都需要比较n次。
  • 适用性: 对于小型数据或基本有序的数据,插入排序由于其简单性,通常会比更复杂的排序算法更快。

插入排序适合以下几种场景:

  • 小型数据集: 对于数量较少的数据(如几十个元素),插入排序的性能较好,足以胜任排序任务。这是因为在小规模数据集上,插入排序的简单性和低空间复杂度使其成为一个有效的选择。
  • 部分有序的数组:如果数组大部分是有序的,插入排序会比其他复杂排序算法更有效率,因为它不需要做太多的移动。当数据已经接近有序时,插入排序的性能会显著提高,因为此时大部分元素已经处于或接近其最终位置,所需的比较和移动次数会大幅减少。
  • 实时数据插入:在不断插入数据并保持有序的场景下,插入排序的特性十分适合,比如插入排序在链表的排序上应用较多。它是一种简单、稳定和原地的排序算法,对于小规模数据和部分有序的数据,插入排序表现良好。
  • 链表排序:由于链表不支持像数组那样的随机访问,因此在链表上进行排序时,插入排序成为了一个非常合适的选择。它可以通过改变节点的指针来实现元素的移动,而不需要额外的存储空间

代码实现

typedef int SortType;
void InsertSort(SortType* a, int n)
{
    for (int i = 0; i < n - 1; i++)
    {
        int end = i;
        int tem = a[end + 1];

        while (end >= 0 && a[end] > tem)  // 这里添加了end >= 0的条件,确保不会越界
        {
            a[end + 1] = a[end];
            end--;
        }
        a[end + 1] = tem;  // 直接在这里插入元素
    }
}

总结

总的来说,直接插入排序就像是那个总是乐于助人的邻居,只要你的“房子”(数组)不是太乱,他总是能帮你快速搞定。但如果“房子”(数组)已经一团糟,他可能就需要更多的时间和耐心了。这就是直接插入排序,简单、直接,有时候还有点幽默。


到了最后:感谢支持

------------对过程全力以赴,对结果淡然处之

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值