Python代码:
""" 插入排序(2)希尔排序、Shell排序 1)确定初始步长 2)按步长将待排序的数进行分组 3)每个分组采用直接插入排序 不断缩小步长,当步长缩小为1时,排序结束。 步长的缩小规律如下: N / 2 = n1 n1 / 2 = n2 n2 / 2 = n3 .... 当n变成1时,被分为1组,算法终止 """ # 希尔排序 def shellSort(lst): s = len(lst)//2 # 初始步长,地板除获取整数部分 while s >= 1: for i in range(0, s): # 步长s,即可以分为s个数组 sublist = [] j = i while j<len(lst): # 生成各分组的数 sublist.insert(0, lst[j]) j = j+s sublist = insertSort(sublist) # 各分组直接插入排序 j = i for k in range(len(sublist)): # 对各分组的数排序 lst[j] = sublist[k] j = j+s s = s//2 # 缩小步长 print("希尔排序后:%s" % lst) # 直接插入排序 def insertSort(lst): for i in range(1,len(lst)): # 未排序的数组 # 次 for j in range(i): # 已排序的数组(初始假设第一个数已排序) if lst[i] <= lst[j]: lst.insert(j, lst[i]) lst.pop(i+1) break return lst if __name__ == "__main__": lst = [3, 6, 9, 1, 4, 7, 2, 8, 5, 0] print("排序前: %s " %lst) shellSort(lst) print(" 排序后: %s" % lst)
输出结果:
E:pythonalgorithm>python3 insertSort2.py 排序前: [3, 6, 9, 1, 4, 7, 2, 8, 5, 0] 希尔排序后:[3, 2, 8, 1, 0, 7, 6, 9, 5, 4] 希尔排序后:[0, 1, 3, 2, 5, 4, 6, 7, 8, 9] 希尔排序后:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 排序后: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
=====结束=====