排序算法系列——直接插入排序
什么是直接插入排序?
直接插入排序,是比较简单的排序算法之一。
它的基本思想是:
将数组分为两个部分,
前部分为已排序好的数组,
后部分为待排序的数组。
排序过程
既然说到要会将数组分为有序部分跟无序部分
那么怎么分呢?
这里的方法跟快速排序[1]里的有点类似。
首先,取数组的第一个元素, 可以把他看做是一个长度为1的有序部分,
后面的元素以这一部分为参照, 然后插入到相应的位置。
举个例子:
假如现在有一个无序数组disorder_arr = [4,2,19,10,-1]。
-
取第一个数
4为参照,索引为0此时有序部分为
4,无序部分为2,19,10,-1。 -
开始循环无序部分,从索引为
1的数开始disorder_arr[1] = 2 -
循环有序部分,从索引为
0的数开始此判断
2与4的大小,2 < 4,将2插入到4的前面。此时有序部分为
2,4,无序部分为19,10,-1。结束循环有序部分
-
继续无序部分的循环,从索引为
2的数开始disorder_arr[2] = 19 -
循环有序部分,从索引为
0的数开始判断
19与2的大小,19 > 2,跳过判断
19与4的大小,19 > 4,此时循环到了有序部分的末尾,因此将19插入到4的后面此时有序部分为
2,4,19,无序部分为10,-1。结束循环有序部分
-
重复上面的步骤...
直到结束无序部分的循环
-
完成数组的排序
写一段代码
# 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]: # 判断当前元素与前一个元素的大小continuefor 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]
欢迎大家友好交流[握手]
参考资料
快速排序: https://juejin.im/post/5defb5826fb9a0162f6215d4
[2]github: https://github.com/alisen39/algorithm/blob/master/algorithms/sorting/insertionSort.py
