美文网首页
动画 | 什么是插入排序?

动画 | 什么是插入排序?

作者: 我脱下短袖 | 来源:发表于2020-01-27 13:32 被阅读0次

    插入排序

    file

    插入排序是比较简单也比较直接的一种排序算法。它是从一堆数据中取出一个数据并将它插入到已排序的数据中合适的位置。

    比如按身高排队,有一个人指挥排队从第二个人开始,按身高把当前的人安插到之前排序好队的合适的位置。

    或者打扑克牌,假设我们拿到了10,J,K,A这四张牌,然后拿到了Q这张牌,那如何让手中的五张牌变为升序呢?如果我们只学了冒泡排序和快速排序,初始状态是10,J,K,A,Q。

    如果是用冒泡排序或者快速排序去做的话,那就可能不合适。结果是对,但是浪费了很多比较次数。

    正常人最简单的方式就是,把Q安插到J和K之间就可以了。

    file

    插入排序正是如此,它的思想就是维护一个有序区,把元素一个一个插入到有序区中的合适的位置,直到所有元素有序为止。

    视频动画

    算法动画视频 地址

    Code
    file
    Result

    初始状态 [5, 1, 3, 7, 4, 6, 2]
    发生交换 [1, 5, 3, 7, 4, 6, 2]
    1趟 [1, 5, 3, 7, 4, 6, 2]
    发生交换 [1, 3, 5, 7, 4, 6, 2]
    2趟 [1, 3, 5, 7, 4, 6, 2]
    3趟 [1, 3, 5, 7, 4, 6, 2]
    发生交换 [1, 3, 5, 4, 7, 6, 2]
    发生交换 [1, 3, 4, 5, 7, 6, 2]
    4趟 [1, 3, 4, 5, 7, 6, 2]
    发生交换 [1, 3, 4, 5, 6, 7, 2]
    5趟 [1, 3, 4, 5, 6, 7, 2]
    发生交换 [1, 3, 4, 5, 6, 2, 7]
    发生交换 [1, 3, 4, 5, 2, 6, 7]
    发生交换 [1, 3, 4, 2, 5, 6, 7]
    发生交换 [1, 3, 2, 4, 5, 6, 7]
    发生交换 [1, 2, 3, 4, 5, 6, 7]
    6趟 [1, 2, 3, 4, 5, 6, 7]

    插入排序优化,减少不必要的交换次数

    回顾一下上面代码运行的结果,发现有很多次的交换,会有一点一点的时间上的消耗。如果我们做减少交换次数的代码,那如何去写呢?

    回顾一下快速排序那篇文章,也使用了减少交换次数的方法。它是一个一个待比较完之后,定位最大的元素或者最小的元素,然后进行交换。

    插入排序把待插入的元素做一个标记,和有序区一个一个元素去做比较。假设是从待插入元素的邻近元素开始比较(从后往前),符合条件的前一个元素去复制粘贴到待插入元素的地址。直到不符合条件才插入到合适的位置。

    视频动画

    算法动画视频 地址

    Code
    file
    Result

    初始状态 [5, 1, 3, 7, 4, 6, 2]
    发生复制 [5, 5, 3, 7, 4, 6, 2]
    1趟 [1, 5, 3, 7, 4, 6, 2]
    发生复制 [1, 5, 5, 7, 4, 6, 2]
    2趟 [1, 3, 5, 7, 4, 6, 2]
    3趟 [1, 3, 5, 7, 4, 6, 2]
    发生复制 [1, 3, 5, 7, 7, 6, 2]
    发生复制 [1, 3, 5, 5, 7, 6, 2]
    4趟 [1, 3, 4, 5, 7, 6, 2]
    发生复制 [1, 3, 4, 5, 7, 7, 2]
    5趟 [1, 3, 4, 5, 6, 7, 2]
    发生复制 [1, 3, 4, 5, 6, 7, 7]
    发生复制 [1, 3, 4, 5, 6, 6, 7]
    发生复制 [1, 3, 4, 5, 5, 6, 7]
    发生复制 [1, 3, 4, 4, 5, 6, 7]
    发生复制 [1, 3, 3, 4, 5, 6, 7]
    6趟 [1, 2, 3, 4, 5, 6, 7]

    长按下图二维码关注公众号,「算法无遗策」持续更新算法

    file

    相关文章

      网友评论

          本文标题:动画 | 什么是插入排序?

          本文链接:https://www.haomeiwen.com/subject/pfqethtx.html