import numpy as np
a=np.random.randint(1,50,10)
a=np.arange(10)
a=10-np.arange(10)
n=len(a)
print(a,n)
左排序
i表示外循环次数,还表示待排序数的边界
for i in range(1,len(a)-1):
for j in range(i,0,-1):
if a[j]<a[j-1]:
a[j],a[j-1]=a[j-1],a[j]
print(i,j,a)
右排序
for i in range(len(a)-2,0,-1):
for j in range(i,len(a)-i-1,-1):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
print(i,j,a)
加入循环中断
for i in range(1,len(a)-1):
for j in range(i,0,-1):
if a[j]<a[j-1]:
a[j],a[j-1]=a[j-1],a[j]
else:
break
不需要两两交换位置,直接插入到比当前值小和大之间的位置,比当前值大的顺序向前移动
for i in range(1,len(a)-1):
p=i-1
k=a[i]
while p+1<len(a) and a[p]>k:
a[p+1]=a[p]
p-=1
a[p+1]=k
希尔排序,不稳定排序,但是速度快,解决了原插入排序数值比对跳动过小的问题。
递减增量排序
希尔排序是先取一个小于待排序列表长度的正整数d1,把所有距离为d1的数
据看成一组,在组内进行插入排序。
希尔排序是基于插入排序进行优化的排序算法。在插入排序中,如果数据
几乎已经排好序时,效率是很高的(想一下抓牌和插牌),时间复杂度为 O(n) 。
但数据的初始状态并不一定是“几乎已经排好序”的,用插入排序每步只能将待
插入数据往前移动一位,而希尔排序将数据分组后,每次可以往前移动di位,
在di > 1时进行的分组和组内排序可以将数据变成“几乎排好序”的状态,此时
再进行最后一次插入排序,提高效率。
gap=len(a)//3+1
while gap>0:
for i in range(gap,len(a)):
c=i-gap
while c>=0 and a[c]>a[c+gap]:
a[c],a[c+gap]=a[c+gap],a[c]
c-=gap
gap=gap//3
print(a)