希尔排序:
算法思想:先将待排序列表分割成若干个形如L[i,i+d,i+2d,...i+kd] 的特殊子表,分别进行直接插入排序,当整个表中元素已呈"基本有序"时,再对全体记录进行一次直接插入排序。
希尔排序过程(王道数据结构):
先取一个小于n的步长d1,把表中全部元素怒分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组中进行直接插入排序;然后取第二个步长d2<d1,重复上述过程,直到所取到的d=1,即所有元素已放在同一组中,再进行直接进行插入排序。
def shell_sort(alist):
n=len(alist)
gap=n//2 #开始的间距设为表长除以2
while gap>=1:
for j in range(gap,n):
i=j
while(i-gap>=0):
if alist[i]<alist[i-gap]:
alist[i],alist[i-gap]=alist[i-gap],alist[i]
i-=gap
else:
break
# 缩短gap
gap//=2
if __name__ == '__main__':
list=[12,3,5,15,67,35,22,69,78]
print("原始序列为:%s"%list)
shell_sort(list)
print("排序后的序列为:%s"%list)
时间复杂度:由于希尔排序的时间复杂度依赖增量序列的函数,这涉及数学上尚未解决的难题,所以其时间复杂度分析较为困难,当n在某个特定范围时,希尔排序时间复杂度约为O(n^1.3),最坏情况下为O(n^2).
空间复杂度:仅使用了常数个辅助单元,时间复杂度为O(1).
稳定性:不稳定,当相同关键字被划分到不同子表时,可能会改变它们之间的相对次序。