[每日一算法]排序之插入排序

3 篇文章 0 订阅
2 篇文章 0 订阅

好好学习算法!

按照《算法导论》原书第2版的次序,首先是排序算法之插入排序。

插入排序很好理解,书上举的例子是打扑克时抓牌,从第一张开始,你每抓一张牌的时候都会将该牌插入到手上所有牌中的合适位置,比如按照习惯来说,我习惯把小牌(比如3啊4啊)都放在右侧,大牌(大王等)放在左侧,那我每次抓起一张新牌的时候眼睛就能迅速定位到该牌能插入到什么位置,当然我们用算法实现的时候这里必须通过比较实现,其实迅速定位只是我们人的眼睛和脑子默契配合而且高速运转的结果。废话不多说,上代码~

#include <stdio.h>

void insertion_sort(int a[], int n)
{
    int i, j, key;
    for(j = 1; j < n; j++)
    {
        key = a[j];
        i = j - 1;
        while(i >= 0 && a[i] > key)
        {
            a[i + 1] = a[i];
            i--;
        }
        a[i + 1] = key;
    }
}

int main()
{
    int n, i;
    int a[100];
    scanf("%d", &n);
    for(i = 0; i < n; i++)
        scanf("%d", &a[i]);
    insertion_sort(a, n);
    for(i = 0; i < n; i++)
        printf("%d ", a[i]);
    return 0;
}

insertion_sort中的过程主要是这样的

我们从第二张牌开始到最后一张牌都是一轮

        每一轮相当于抓起一张牌

                然后和手上已经排好序的牌从后往前进行比较,如果比自己大则向后挪,否则就找到了自己的位子,放进去就可以了。


讨论完插入排序的算法过程,接下来我们来看看算法的时间复杂度。

不难发现,插入算法的最佳情况就是输入数据已经排好序(这里指非降序排列),每一轮只需比较一次即可,因此时间复杂度是O(n)

在最差情况下,即输入数据是逆序(这里是指降序)时,每一轮都需要和前边所有已排好序的数据进行比较,因此时间复杂度是O(n2)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值