插入排序

将一个元素插入到一个有序序列中,使插入之后的序列仍然有序,是插入排序的核心思想。

概述

插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。我们将待排序数组分为前(有序)后(无序)两部分,每次从后一部分取一个数据,然后在前一部分找其对应位置,找到后将其置入,然后增加有序部分的长度,持续这样的操作,直到整个序列有序。

原理详解

以排升序为例。

这里写图片描述

如上图所示,插入排序具体步骤可描述为如下:

  • key 将待插的元素储存;
  • 从后往前,依次将 key 与有序序列中的元素(用cur标记)比较,若 key 比该元素小,则将其向后移动一个位置;
  • 直到发现发现一个元素小于(等于) key(或者超出数组范围),则此时已经找到了插入位置(下标为cur+1),将其插入。
  • 有序序列长度加1,重复上述步骤,直至整个序列有序。

时间复杂度:对于长度为 N 的序列,我们需要进行 N-1 此插入,而且每次插入,最坏情况需要挪动所有有序序列元素,而最好情况则是不需挪动元素,故它的平均时间复杂度为:O(n^2),由于相同元素在排序前后其相对位置不会发生变化,故该排序算法是稳定的

C代码实现
void InsertSort(int *a, size_t n)
{
    //把第i个数插入到[0, i-1]有序区间内,使插入后的序列人保持有序
    for (size_t i = 1; i < n; ++i){
        int key = a[i];//
        size_t cur = i - 1;
        while (cur >= 0 && key < a[cur]){
            a[cur + 1] = a[cur];
            --cur;
        }
        a[cur+1] = key;
    }
}

——完!

【作者:果冻 http://blog.csdn.net/jelly_9

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值