排序算法系列——直接插入排序
什么是直接插入排序?
直接插入排序,是比较简单的排序算法之一。
它的基本思想是:
将数组分为两个部分,
前部分为已排序好的数组,
后部分为待排序的数组。
排序过程
既然说到要会将数组分为有序部分跟无序部分
那么怎么分呢?
这里的方法跟快速排序[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.py
class 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]
欢迎大家友好交流[握手]
参考资料
快速排序: https://juejin.im/post/5defb5826fb9a0162f6215d4
[2]github: https://github.com/alisen39/algorithm/blob/master/algorithms/sorting/insertionSort.py