• 插入排序


    本篇来学习十大排序中的插入排序,学习其算法思想并尝试实现排序。

    插入排序有两种:直接插入排序和折半插入排序。

    直接插入排序

    直接插入排序(4,3,1,2)的流程如下图:

    image

    对于每个未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其过程大概是这样的:

    第一个元素就认为是有序的,取第二个元素,判断是否大于第一个元素。若是大于,表示已经有序,不用移动,否则将已经有序的序列整体向后移动一个位置。依此类推,直到所有元素已经有序。

    可以借助上面的图来理解。

    时间复杂度

    需要到两层循环来处理,外层循环用于跑多少趟,而内层循环用于移动元素位置,因此时间复杂度仍为 O ( n2 )

    伪代码

    C语言版

    OjbC版

    Swift版

    折半插入排序

    从第二个元素开始逐个置入监视哨,使用low、high标签进行折半判断比较大小,并确认插入位置,该位置到最后一个数全部后移一位,然后腾出该位置,把监视哨里面的数置入该位置。依此类推进行排序,直到最后一个数比较完毕。

    时间复杂度

    折半插入排序, 即查找插入点的位置, 可以使用折半查找,这样可以减少比较的次数, 但是移动的次数不变,因此,时间复杂度仍为 O(n2) ;

    伪代码

    C语言版

    Swift版

    小结

    对于折半插入排序算法,它需要一个哨兵,数组的0号位置是用作哨兵,而不存储数据。为什么所找到的位置是high+1呢?因为最后退出while循环一定是high = mid – 1之后,导致条件low > high而退出。所以,最后所找到的位置一定是high = mid – 1,由于减了1,所以应该插入的位置是high + 1。

  • 相关阅读:
    IoC 中 car 对象的配置如下,现在要添加 user 对象,并且将 car 注入到 user 中,正确的配置是?
    说说 IoC 中的继承和 Java 继承的区别
    bean 的 scope 有几种类型?请详细列举。
    简单谈谈 IoC 容器的原理
    谈谈你对 Spring IoC 和 DI 的理解,它们有什么区别?
    day13-14 内置函数
    day12 生成器(重要)
    day11 闭包和迭代器
    day10 函数进阶
    day09 函数
  • 原文地址:https://www.cnblogs.com/gongyuhonglou/p/6064599.html
Copyright © 2020-2023  润新知