1. 什么是希尔排序?
希尔排序(Shell Sort)是一种内部排序算法,是插入排序的一种更高效的改进版本,也称作缩小增量排序。
希尔排序的基本思想是:先将待排序的元素分成若干个子序列,子序列内部进行插入排序,使得整个序列基本有序,最后再对全体元素进行一次插入排序。
2. 实现过程
2.1 算法描述
- 选择一个增量序列 $t_1,t_2,…,t_k$,其中 $t_1=n$ 且 $t_i > t_{i+1}$;
- 按增量序列个数 k,对序列进行 k 趟排序;
- 每趟排序,根据对应增量 $t_i$,将待排序序列分割成若干长度为 $m$ 的子序列,分别对各个子序列进行插入排序;
- 重复第3步,直到增量 $t_i=1$,即排序完成。
2.2 代码实现
def shellSort(arr):
n = len(arr)
gap = n // 2 # 初始增量
while gap > 0:
# 对各个子列表进行插入排序
for i in range(gap, n):
j = i
while j >= gap and arr[j - gap] > arr[j]:
arr[j], arr[j - gap] = arr[j - gap], arr[j]
j -= gap
# 更新增量
gap //= 2
return arr
3. 优缺点
3.1 优点
- 通过分组进行排序,从而减少了数据交换的次数,提高了算法的执行效率;
- 相对于冒泡排序和选择排序,其时间复杂度要低得多。
3.2 缺点
- 增量序列的选择和排序结果密切相关;
- 在最坏情况下排序时间复杂度是 $O(n^2)$,且希尔排序的性能与增量序列的选择有很大关系。
4. 示例说明
4.1 示例1
arr = [18, 11, 14, 7, 1, 16, 22, 20, 9, 15]
print(shellSort(arr)) # [1, 7, 9, 11, 14, 15, 16, 18, 20, 22]
以上为一个正常的排序操作,未出现排序异常情况。
4.2 示例2
arr = [22, 20, 18, 16, 15, 14, 11, 9, 7, 1]
print(shellSort(arr)) # [1, 7, 9, 11, 14, 15, 16, 18, 20, 22]
以上为最坏情况的一个排序,数据随机分布和完全倒序分布的情况下,希尔排序的排序时间相差巨大,性能取决于增量序列的选择。