希尔排序原理:首先将待排序的元素分成多个子序列,使得每个子序列的元素个数相对较少,对各个子序列分别进行直接插入排序,最后在基本有序后最后做一次直接插入排序。
时间复杂度:O(nlogn) 最坏是O(n ** s)(1<s<2) 不稳定的排序方法;
空间复杂度:O(1)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 18 03:42:18 2019
@author: honorwh
"""
#希尔排序
def ShellSort(A):
count = len(A)
step = count // 2
while step > 0:
for i in range(0, step):
j = i + step
while j < count:
k = j - step
key = A[j]
while k >= 0:
if A[k] > key:
A[k + step] = A[k]
A[k] = key
k -= step
j += step
step //= 2
return A
A = [3, 4, 2, 8, 9, 5, 1]
A = ShellSort(A)
print(A)
希尔排序有个重点是对于增量(increment)的选择,这里选择是step = len(A) // 2, step //= 2
结合以上图片给出每一步的数值转移:
A = [3, 4, 2, 8, 9, 5, 1]
3 4 2 8 9 5 1(以step = len(A) // 2为步长) 第一次比较的是3 8;8 1; 3 1
即3 4 2 8 9 5 1 --> 3 4 2 1 9 5 8 --> 1 4 2 3 9 5 8
所以,1 4 2 3 9 5 8是第一次比较的结果;同理,在以step = len(A) // 2的步长比较之后,step //= 2
即第二次(在本例已经是最后一次,因为step = 1),所以同理即可得到结果。
这个编辑比较麻烦,有兴趣可以自己每一步的详细过程推一推,更容易理解。