希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

1 """
2 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。
3 """
4
5
6 # 方式一:元素采取直接插入排序从前往后比较
7 def shell_sort(int_list):
8 length = len(int_list)
9 if length <= 1: return int_list
10 step = length // 2
11
12 while step > 0:
13 for i in range(step, length, step):
14 item = int_list[i]
15 for j in range(0, i, step):
16 if int_list[j] > item:
17 for k in range(i, j, -step):
18 int_list[k] = int_list[k - step]
19 int_list[j] = item
20 break
21 step //= 2
22 return int_list
23
24
25 # 方式二:元素采取直接插入排序从后往前比较
26 # 继续缩小增量
27 def shell_sort1(alist):
28 gap = len(alist) // 2
29 while gap >= 1:
30 # 将增量设置成gap
31 for i in range(gap, len(alist)):
32 while i > 0:
33 if alist[i] < alist[i - gap]:
34 alist[i], alist[i - gap] = alist[i - gap], alist[i]
35 i -= gap
36 else:
37 break
38 gap //= 2
39 return alist
40
41
42 # print(shell_sort([11, 3, 5, 89, 1,23456,87678,2345,4567,0,3,5]))
43 if __name__ == '__main__':
44 int_str = input("请输入逗号分割的整数>>>").strip()
45 int_list = [int(i) for i in int_str.split(",")]
46 print(shell_sort(int_list))
47 # print(shell_sort1(int_list))