vlambda博客
学习文章列表

排序算法系列——直接插入排序

什么是直接插入排序?

直接插入排序,是比较简单的排序算法之一。

它的基本思想是:
将数组分为两个部分,
前部分为已排序好的数组,
后部分为待排序的数组。

排序过程

既然说到要会将数组分为有序部分跟无序部分

那么怎么分呢?

这里的方法跟快速排序[1]里的有点类似。

首先,取数组的第一个元素, 可以把他看做是一个长度为1有序部分,
后面的元素以这一部分为参照, 然后插入到相应的位置。

举个例子:

假如现在有一个无序数组disorder_arr = [4,2,19,10,-1]

  1. 取第一个数4为参照,索引为0

    此时有序部分为4无序部分为2,19,10,-1

  2. 开始循环无序部分,从索引为1的数开始

    disorder_arr[1] = 2

  3. 循环有序部分,从索引为0的数开始

    此判断 24的大小,2 < 4,将2插入到4的前面。

    此时有序部分为2,4无序部分为19,10,-1

    结束循环有序部分

  4. 继续无序部分的循环,从索引为2的数开始

    disorder_arr[2] = 19

  5. 循环有序部分,从索引为0的数开始

    判断192的大小,19 > 2,跳过

    判断194的大小,19 > 4,此时循环到了有序部分的末尾,因此将19插入到4的后面

    此时有序部分为2,4,19无序部分为10,-1

    结束循环有序部分

  6. 重复上面的步骤...

    直到结束无序部分的循环

  7. 完成数组的排序

写一段代码

# insertionSort.pyclass Solution: def insertion(self, disorder_arr: list): for i in range(1, len(disorder_arr)): # 从第二个元素开始 if disorder_arr[i] > disorder_arr[i - 1]: # 判断当前元素与前一个元素的大小 continue
for j in range(i): # 遍历当前元素之前的元素(有序),找到插入点插入 if disorder_arr[i] < disorder_arr[j]: disorder_arr.insert(j, disorder_arr.pop(i)) return disorder_arr

代码十分简单,相信大家都能看懂~

总结

综合来讲,直接插入排序的基本操作是将数据插入到已排序好的数组中,

属于比较简单的排序算法。

它的平均时间复杂度为O(n^2),

空间复杂度为O(1)

是一种稳定的排序算法。


代码已上传至github[2]
欢迎大家友好交流[握手]

参考资料

[1]

快速排序: https://juejin.im/post/5defb5826fb9a0162f6215d4

[2]

github: https://github.com/alisen39/algorithm/blob/master/algorithms/sorting/insertionSort.py