插入排序(直接插入排序) :假设有待排序表L[1...n]:
有序序列L[1...i-1] | L(i) | 无序序列L[i=1...n] |
算法思想:初始假定L[1]是一个已经排好序的子序列,然后将L(2)~L(n)依次插入到前面已排好序的子序列,执行该操作n-1次就能得到一个有序表,在从后向前的比较过程中,需要反复把已排序元素逐步向后移位,为新元素提供插入空间。
def insert_sort(alist):
n=len(alist)
for j in range(1,n):
for i in range(j,0,-1): # i:j,j-1,j-2,...,1
if alist[i]<alist[i-1]:
alist[i],alist[i-1]=alist[i-1],alist[i]
else:
break
if __name__ == '__main__':
list=[12,3,5,15,67,35,22,69,78]
print("原始序列为:%s"%list)
insert_sort(list)
print("排序后的序列为:%s"%list)
插入排序算法性能分析:
空间复杂度:仅使用了常数个辅助单元,因而空间复杂度为O(1)
时间复杂度:
(1)最好时间复杂度O(n):最好情况下,表中元素已经有序,此时每插入一个元素,都只需比较一次而不用移动元素。
(2)最坏时间复杂度O(n^2):最坏情况下,表中元素序列与排序结果相反时,总的比较次数达到最大,i=2,3,...n,总的移动次数也达到最大,i=2,...n对i+1求和。
稳定性:
稳定:每次插入元素时总是从后向前先比较再移动,因此不会出现相同元素相对位置发生变化的情况。