插入排序(内附代码)

插入排序的原理与打扑克摸牌一致,当一张新牌来时,我们会选择一个合适的位置插入,插入排序算法原理类似,当数据的前半部分有序时,依次遍历后半部分的数据,将每个无序数据插入到前面有序部分中。

在此处,我们用双链表的方式实现该算法。其中链表的构造过程与之前博客中选择排序部分一致,在此不做赘述。下面,看一下选择排序的代码:

void insertsort(node2* head, node2* tail) {
    node2* pos = head->after->after;
    while (pos != tail)
    {
        node2* insert = pos->before;
        while (insert->value>pos->value)
        {
            insert = insert->before;
        }
        node2* temp = pos;
        pos->before->after = pos->after;
        pos->after->before = pos->before;
        pos = pos->after;
        temp->before = insert;
        temp->after = insert->after;
        insert->after = temp;
        temp->after->before = temp;
    }

}

在此,插入过程我们没有用二分查找的原因在于,二分查找适用于数组,因为数组方便读取数据,链表中二分查找没有优势。那么,为什么不直接用数组来做插入排序算法呢?这是因为,如之前博客中对数组和链表的分析,插入数据时,数组需要移动n个数据,而链表只需要处理当前节点就可以。

插入排序总的说来,最坏和平均时间复杂度均为o(n^2)最好的情况下时间复杂度为o(n),对比选择排序,选择排序即使在最好情况下,时间复杂度也为o(n^2)

<think>嗯,用户之前问过GESP C++3级考试的相关内容,现在又要求解释插入排序,要求简洁易懂。首先,我需要确认用户的需求。可能他正在准备这个考试,而插入排序是考试的一部分,需要快速掌握。 用户之前得到的是关于考试范围、知识点和例题的详细回答,现在需要插入排序的讲解。考虑到用户是入门进阶阶段,可能需要基础的解释,避免过于复杂的术语。 插入排序的核心思想是关键,应该用简单的生活例子来类比,比如整理扑克牌,这样容易理解。需要分步骤讲解,把过程拆解,每一步做什么,为什么这样做。 同时,用户可能需要代码示例,但因为是C++3级,代码要符合考试要求,比如使用数组而不是高级数据结构。注意代码的注释,帮助理解。 时间复杂度部分也是考点,必须提到最好、最坏和平均情况,但不用深入数学证明,保持简洁。还要比较与其他排序的区别,比如和冒泡排序对比,突出插入排序的优势,比如更适合部分有序的数据。 要确保语言口语化,避免冗长,用点句和例子来增强理解。可能还需要提到稳定性,因为这在考试中可能涉及选择题。 最后,检查是否符合之前的格式要求,比如行内公式用$...$,独立公式用$$...$$,但用户这次的问题可能不需要太多公式,所以可能用文字描述即可。保持回答结构清晰,步骤分明,帮助用户逐步理解插入排序的原理和实现。</think>### 插入排序极简教程(生活案例) #### 一、核心思想 **类比整理扑克牌**:左手拿无序的牌,右手将每张新牌插入左手已排序牌的正确位置。 #### 二、分步演示(以数组 `[5, 2, 4, 6, 1]` 为例) 1. **初始状态**:左手只有第一张牌 `[5]`(已排序),右手剩下 `[2,4,6,1]` 2. **插入2**: - 比较:2 < 5 → 将5右移 - 结果:`[2,5]` 3. **插入4**: - 4 < 5 → 右移5 - 4 > 2 → 停止 - 结果:`[2,4,5]` 4. **重复操作**直到所有元素有序 #### 三、C++代码实现 ```cpp void insertionSort(int arr[], int n) { for (int i = 1; i < n; i++) { // 从第二个元素开始 int key = arr[i]; // 当前要插入的牌 int j = i - 1; // 将比key大的元素右移 while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; // 后移操作 j--; } arr[j + 1] = key; // 插入正确位置 } } ``` #### 四、关键特性 1. **时间复杂度**: - 最好情况(已有序):$O(n)$ - 最坏情况(逆序):$O(n^2)$ 2. **适用场景**: - 小规模数据 - 数据基本有序时效率高 3. **与冒泡排序对比**: - 更少交换次数(平均性能更好) - 稳定排序(相同元素保持原顺序) #### 五、快速记忆口诀 **“抽牌→找位→插空”**:每次抽一张牌,从右往左找插入位置,腾出空位后插入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值