希尔排序算法数插入排序算法进阶改版而来,希尔排序减少了插入排序种移动数据的次数,加快了排序进程
希尔排序的基本思路:(1)把原始数据按照特定距离分为几个数列,然后分别对这几个数列排序;(2)然后排序后的数据再减小特定间隔距离,重复第一步,直到排序完成
具体代码如下:
def shell_sort(data):
n=len(data)
step = n // 2
while step >= 1:
for i in range(step,n):
while i - step >= 0 and data[i] < data[i - step]:
if data[i] < data[i - step]:
data[i], data[i - step] = data[i - step], data[i]
i -= step
else:
break
step //= 2
return data
print(shell_sort([13,47,35,67,98,45]))
#输出 13 47 35 67 98 45
代码解释:
(1)有这样一组数列,现在我们对其进行递增排序
(2) 原始数据有6个数,6/2=3,所以每隔3位组成一个数列,然后分别对他们进行排序
(3) 缩小间隔数为2,所以每隔2位组成一个数列,然后分别对他们进行排序
(3) 继续缩小间隔数为1,对他们进行排序
(4)至此,排序完成输出结果
总结:
希尔排序适用于大规模数据的排序,特别是当数据基本有序时,其效率会更高。它通过分组的方式,使得数据在局部范围内有序,从而减少整体排序的复杂度。
注意事项:
-
间隔的选择:希尔排序的性能依赖于间隔序列的选择。这段代码使用的是最简单的间隔序列,即每次将间隔减半。然而,不同的间隔序列可能会带来不同的性能表现,选择合适的间隔序列是提高希尔排序效率的关键。
-
稳定性:希尔排序不是稳定的排序算法,即相等的元素可能会改变它们的相对顺序。如果需要稳定的排序,可以考虑使用其他算法,如归并排序或冒泡排序。
-
时间复杂度:希尔排序的时间复杂度取决于间隔序列的选择,最坏情况下可能接近 O(n^2),但在某些情况下,特别是使用特定的间隔序列时,其时间复杂度可以降低到 O(n log n)。
-
空间复杂度:希尔排序是原地排序算法,空间复杂度为 O(1),因为它只需要一个额外的存储空间用于交换元素。
平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | |
希尔排序算法 | O(n log n) | O(n^2) | O(1) |