個人技術博客地址:http://songmingyao.com/
原理
- 為插入排序的優化
- 對要排序的列表根據一定間隔(初始間隔一般設為列表長度的一半)進行分組
- 對各列表之間相同位置(下標)的元素進行插入排序
- 間隔減半,再次分組并對各列表之間相同位置(下標)的元素進行插入排序
- 如此循環,最終間隔為1,即為正常的插入排序
源碼
def shell_sort(l):
n = len(l)
# 初始間隔
gap = n//2
while gap > 0:
for i in range(gap, n):
for j in range(i, gap-1, -gap):
if l[j] < l[j-gap]:
l[j], l[j-gap] = l[j-gap], l[j]
else:
break
gap //= 2
if __name__ == '__main__':
l = [6, 5, 2, 8, 9, 4, 1, 0, 3, 7]
print(l)
shell_sort(l)
print(l)
時間復雜度
- 最優時間復雜度(初始間隔為列表長度一半時):O(nlogn)
- 最壞時間復雜度:O(n2)
- 穩定性(多個元素等值的情況下是否會破壞原有順序):不穩定