__author__ = 'steven'
# coding=utf-8
'''希尔排序
希尔排序的实质就是分组插入排序,该方法又称*缩小增量(step)排序*,因DL.Shell于1959年提出而得名。
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
“比较”在希尔排序中是最主要的操作,而不是“交换”。用这样步长串行的希尔排序比插入排序和堆排序都要快,
甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。
平均时间复杂度为:O(nlogn)
希尔排序是非稳定排序算法。
'''
# list = [8,7,6,5,4,13,2,1]
list = [5, 8, 1, 4, 2, 7, 3, 6]
# list_ascended = [1, 2, 3, 4]
# list_descended = [5, 4, 3, 2]
def shell_sort(list):
step = len(list) // 2
while step > 0:
# print("step=%d"%step)
# print(list)
for i in range(step, len(list)):
# 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置
while i >= step and list[i - step] > list[i]:
list[i], list[i - step] = list[i - step], list[i]
i -= step # 这里类似插入排序要逐步向前比较插入,每次跳过step的步长
# print(list)
step //= 2
return list
print(shell_sort(list))