python 插入排序
把第一个数固定,然后将其它数插入,小的放前面。备份这个后续插入的数,然后将这个数和前面的数作比较,比前面的数小,就将前面的数后移。这样相当于前面的数就挪出一个空,如果再往前没有比它小的了,就把开始备份好的数填进去。
插入排序,稳定,平均和复杂都是 O(n2) O ( n 2 )
def insert_sort(L):
for i in range(1, len(L)):
# 第1个数,index=0,单独拿出来
v = L[i]
j = i
while j>=1 and L[j-1]>v:
# j大于等于1,查看前一个数
# 只要前面的数L[j-1]大于k,就往后移
L[j] = L[j-1]
j -= 1
L[j] = v
def insert_sort(L):
for i in range(1, len(L)):
v = L[i]
j = i - 1
while j>=0 and L[j]>v:
# 大于等于0,当前数进行比较
L[j+1] = L[j]
j -= 1
# 比较完成,j=-1
L[j+1] = v
希尔排序:
因为插入排序适合比较有序的数列,所以可以提前大步子的排好序
先生成序列,按照k = 1+3k,从大到1;
然后进行插入排序,不稳定,平均复杂度 O(nd) O ( n d ) ,在这里d=1.5;最坏 O(n2) O ( n 2 )
def insert_sort(L, g):
for i in range(g, len(L)):
v = L[i]
j = i - g
while j>=0 and L[j]>v:
L[j+g] = L[j]
j -= g
L[j+g] = v
def shell_sort(L):
gg = [1+3*k for k in range(len(L)) if 1+3*k < len(L)]
# 反序
gg.reverse()
for g in gg:
insert_sort(L, g)
补充一个排序,不知道算不算插入排序,有点冒泡的味道
def insert_sort(L):
for i in range(1, len(L)):
j = i
while j>=1 and L[j]<L[j-1]:
# 只要后面比前面的小,就交换
L[j], L[j-1] = L[j-1], L[j]
j -= 1