【算法系列】排序算法(2)直接插入排序

排序(2)直接插入排序
一、前言

直接插入排序(Insertion Sort)是一种最简单的插入排序。下面主要以升序作为讨论。

二、算法思想

插入排序:每一趟将一个带排序的记录,按照其关键字的大小插入到有序队列的合适位置里,直到全部插入完成。

编程语言:
假设有一组无序序列R0,R1,…,RN-1。
(1)首先,假设序列中下标为0的元素为一个有序序列。
(2)然后,我们一次吧R1,R2,…,RN-1插入到这个有序序列中。所以,我们需要一个外部循环,从1循环至N-1。
(3插入过程。假设此时我们需要插入Ri,则插入R时,前i-1个数已经有序。
所以,我们需要将Ri和R0-Ri-1进行比较,确定插入到合适的位置。此时需要一个内部循环。若从后往前比较,即从下标i-1开始向0进行扫描。
其实整个过程就等于将比Ri大的数往后挪,腾出一个合适的位置将Ri插入。

时间复杂度:
O(n^2)。最好情况下,已经有序O(n),最坏情况下逆序O(n^2)

稳定性:
稳定

适用场合:
当数组已经基本有序时,使用插入排序能有效减少移动的次数,时间消耗最少。

三、代码
/*
    排序(2)直接插入排序
    Time:2018-02-19
    Author:Stella Chen
    Content:
    A simple example about Insertion Sort
*/

#include<stdio.h>
#define N 10

void insert_sort(int ary[], int n) {
    int temp;

    //假设第1个元素有序,从第2个元素开始依次插入有序序列
    for (int i = 1; i < n; i++)
    {
        printf("第%d趟排序:\n", i);

        //取出第1个数和前i-1个数比较,插入合适位置
        temp = ary[i];
        //因为i-1个数都是有序的,只要当前比较的数比t大,就把这个数后移一位
        int j = i - 1;
        for (j; j >= 0 && ary[j]>temp; j--)
        {
            printf("排序中:");
            ary[j + 1] = ary[j];

            for (int i = 0; i < N; i++)
                printf("%d ", ary[i]);
            printf("\n");
        }
        ary[j + 1] = temp;
        printf("第%d趟排序结束:\n", i);
        for (int i = 0; i < N; i++)
            printf("%d ", ary[i]);
        printf("\n\n");
    }
}

int main() {
    int ary[10] = { 10,2,3,1,5,15,7,9,20,11 };

    printf("The original sequence:\n");
    for (int i = 0; i < N; i++)
        printf("%d ", ary[i]);
    printf("\n\n");

    insert_sort(ary, N);

    return 0;
}

执行结果如下:
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值