算法原理
思想与选择排序相似,同样是将一个序列分成两个部分:有序和无序,但是插入排序不对无序序列进行操作,而是在有序序列中执行操作。原理图如下:
时间复杂度
最坏时间复杂度 为O(n^2),最优时间复杂度为O(n)
算法步骤
- 将初始序列的第一个元素作为已经排好的序列,序列后面的元素作为未排序序列
- 按顺序拿到未排序序列中的每一个元素,并与前面的已排序序列进行比较,将元素插入到合适的位置。(带插入元素如果比已排序序列中的元素小,就插入到相应元素的前面,相等或大于就插入到后面)
算法实现
def insert_sort(alist):
"""插入排序"""
n = len(alist)
for j in range(1,n):
i = j
while i > 0:
if alist[i] < alist[i-1]:
alist[i - 1] ,alist[i] = alist[i],alist[i - 1]
i -= 1
return alist
上述代码在对于已经排好序的序列来说,最优和最坏时间复杂度均是O(n^2),因此我们可以优化一下代码。
def new_insert_sort(alist):
"""插入排序"""
n = len(alist)
for j in range(1,n):
i = j
while i > 0:
if alist[i] < alist[i-1]:
alist[i - 1] ,alist[i] = alist[i],alist[i - 1]
i -= 1
else:
break
return alist
优化后的代码最优时间复杂度为O(n)。