工作中遇到大量数据需要排序,直接上冒泡太慢,用快排又觉得重了,这时候可以考虑希尔排序。它不像完全暴力的插入排序,而是通过“跳跃式”比较,把远距离元素先拉近,再慢慢收拢,效率提升明显。
希尔排序的核心思想
希尔排序其实是插入排序的升级版。普通插入排序每次只和前面一个元素比,如果最小的元素在最后,就得一步步往前挪,特别费劲。希尔排序的做法是:先把数组按一定间隔分成几组,对每组做插入排序。这个间隔会逐步缩小,到最后变成1,就是普通的插入排序了。但由于前面几轮已经让数组变得“基本有序”,最后一轮很快就能收尾。
举个生活中的例子:你要整理一柜子书,如果从头一本本挪,效率很低。不如先隔五本取一本排序,让大体顺序出来,再慢慢细化,最终整整齐齐。
如何写希尔排序代码
下面用 Python 实现一个简单的希尔排序,逻辑清晰,适合日常开发参考。
def shell_sort(arr):
n = len(arr)
gap = n // 2 # 初始间隔设为数组长度的一半
while gap > 0:
for i in range(gap, n):
temp = arr[i] # 当前要插入的元素
j = i
# 在同一组内进行插入排序
while j >= gap and arr[j - gap] > temp:
arr[j] = arr[j - gap]
j -= gap
arr[j] = temp
gap //= 2 # 缩小间隔
return arr
# 使用示例
data = [64, 34, 25, 12, 22, 11, 90]
print("原数组:", data)
print("排序后:", shell_sort(data))
这段代码的关键是 gap 的变化。一开始跳得远,后面越来越密,最后 gap=1 时做一次精细调整。你会发现,对于中等规模的数据,它的表现比纯插入排序好不少,而且代码也不复杂,适合嵌入到脚本或工具函数里。
实际应用场景
虽然现在主流语言都自带高效排序方法,但在一些轻量级工具、嵌入式脚本或者算法题中,手写排序还是难免的。希尔排序代码短、理解直观,不需要递归栈,适合内存受限的环境。比如你在写一个小爬虫,抓回来的数据想本地排个序再存,用这个就很合适。
当然,数据量特别大的时候,还是推荐用系统内置的 sorted() 或 sort(),它们底层是 Timsort 这类更高级的算法。但了解希尔排序,能帮你更清楚“排序到底发生了什么”,而不是只会调 API。