希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。
def shell_sort(alist):
"""
希尔排序
:param alist:
:return:
"""
n = len(alist)
gap = n // 2
while gap >= 1:
# j是需要比较的次数
for j in range(gap, n): # 3---7
# i 是需要控制的索引
i = j
# 比较的逻辑和控制i的变换的逻辑
while (i - gap) >= 0:
if alist[i] < alist[i-gap]:
# 交换
alist[i], alist[i-gap] = alist[i-gap], alist[i]
# 修改i
i -= gap
else:
break
# 控制间隙的变化
gap //= 2
if __name__ == '__main__':
li = [6, 7, 5, 3, 4, 1, 8]
shell_sort(li)
print(li)
希尔排序是首先将传入的列表分为(列表长度//2)段, 此案例分为2段,用第二段的第一个数b与第一段第一个a数比较大小, 如果b<a, 那么将a和b换位置,继续循环后将用第二段的第二个数d与第一段第二个c数比较大小以此类推…
全部循环之后再将列表按照(上次分割的短数//2)段,此案例分为1段,也就是变成了一个依旧不是规律的数组,最后进行插入排序