希尔排序-Python

希尔排序虽然经常听说,但是不经常玩算法的人可以都没写过,第一次写希尔排序就犯了一个错误

先上代码

# -*- coding:utf-8 -*-
# @Time :2019/7/7 8:29
# @Author :曾格

def shell_sort(alist): #错误的希尔排序
""""希尔排序"""
n=len(alist)
gap=n//2
while gap>0: # 保证gap为1是最后一趟排序
print("当前步长:{0} ".format(gap))
i=0 #下标从0开始
while i<gap: # 每划分一次需要进行gap次排序
# 每进行一个排序吗,i要加1
#while循环结束,i要重新从0开始
j=i
while j<n-gap: # 一次插入排序
j=j+gap
t=j
while alist[t]<alist[t-gap] and t>=gap:
alist[t],alist[t-gap]=alist[t-gap],alist[t]
t-=gap
i+=1
gap=gap//2
return alist

# 但这样是错误的,这个函数是先把第一个子序列排序完再排接下来一个,然后再排下一个,,,
# 正确思路应该是一次遍历这些子序列全部排好

def shell_sorter(alist): #正确的希尔排序
""""希尔排序"""
n = len(alist)
gap = n // 2
while gap>0:
for i in range(gap,n):
j=i
while alist[j]<alist[j-gap]:
alist[j],alist[j-gap]=alist[j-gap],alist[j]
j-=gap
gap//=2
return alist


if __name__=="__main__":
st=[10,23,56,34,23,67,43,12,3,5,26,46,32,4,65]
print(shell_sort(st))
心之所愿,永不相忘
原文地址:https://www.cnblogs.com/zgll/p/11146021.html