排序算法----希尔排序

希尔排序

  希尔排序(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))

猜你喜欢

转载自www.cnblogs.com/open-yang/p/11367089.html