1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| ''' 希尔排序(插入排序发展而来):
定义增量序列 Dm > Dm-1 > ... > D1 = 1。
* 对每个Dk 进行 Dk间隔 的排序。 (注意:"Dk间隔" 有序的序列,在执行 Dk-1间隔 排序后,仍然是 Dk间隔 有序的。) * 详解: Dk间隔 排序,指的是隔Dk个元素,跳着比大小然后交换, 然后每隔Dk个元素回头再比大小交换, 相当于完成一个隔着Dk个元素 完成一次插入 的 插入排序。
''' import numpy as np import math
def Shell_Sort(A): N = len(A) D_list = N * np.logspace(-1,-math.log(N,2),int(math.log(N,2)),base=2) for D in D_list: if int(D) == 0: D = 1 D = int(D) print(D) for p in range(D,N,D): temp = A[p] current = p preindex = p-D while preindex >=0 and A[preindex] > temp: A[current] = A[preindex] current = preindex preindex -= D A[current] = temp
A = [3,1,9,8,28,36,44,35,0,100] Shell_Sort(A) print(A)
|