思路
思路:
Step1: 首先取一个整数d1 = n // 2, 将元素分成d1个组,
每相邻量元素之间的距离为d1, 在各组内分别进行直接插入排序
Step2: 再取一个整数d2 = d1 // 2, 重复上述分组排序过程,
直到d1 = 1为止,即所有元素在一个组内直接进行插入排序
特点
希尔排序每趟并不使元素有序,而是使整体数据越来越接近有序,
最后一趟使所有数据有序
时间复杂度
跟d1的取值算法有关,
在本例中d1的取值算法为:整除2,直到为1为止。
时间复杂度为O(n^2)
代码示例
"""希尔排序(把插入排序中的1换成gap)
是一种分组插入排序算法
思路:
Step1: 首先取一个整数d1 = n // 2, 将元素分成d1个组,
每相邻量元素之间的距离为d1, 在各组内分别进行直接插入排序
Step2: 再取一个整数d2 = d1 // 2, 重复上述分组排序过程,
直到d1 = 1为止,即所有元素在一个组内直接进行插入排序
希尔排序每趟并不使元素有序,而是使整体数据越来越接近有序,
最后一趟使所有数据有序
时间复杂度:跟d1的取值算法有关,在本例中d1的取值算法为:整除2,直到为1为止。
时间复杂度为O(n^2)
"""
import random
def insert_sort(ls, gap, reverse=False):
"""插入排序是一种分组插入排序算法
trick: 把插入排序中的1换成gap即可
Args:
:param ls: list, 待排序的列表
:param gap: int, 每组元素之间的间隔
:param reverse: bool, 升序还是降序,默认升序
"""
length = len(ls)
for i in range(gap, length):
tmp = ls[i]
j = i - gap
while j >= 0 and ls[j] > tmp:
ls[j + gap] = ls[j]
j -= gap
ls[j + gap] = tmp
def shell_sort(ls):
"""希尔排序
Args:
:param ls: list, 待排序的列表
"""
d1 = len(ls) // 2
while d1 >= 1:
insert_sort(ls, d1, True)
d1 //= 2
ls = list(range(20))
random.shuffle(ls)
shell_sort(ls)
print(ls)