插入排序(内附代码)

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

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

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值