排序算法四:希尔排序

希尔排序

希尔排序是特殊的插入排序。

他用来解决下面的问题:

image-20240316175342022

当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。

算法原理

希尔排序也叫做缩小增量排序,希尔排序时把记录按照下标的一定增量分组,对每组使用插入排序算法排序;随着增量逐渐减小,每组包含的词也变小,当增量减为1时,整个文件被分为一组,算法结束。

image-20240316135219157

import random
import time
def shell_sort(array):
    n = len(array)
    gap=n//2

    while gap > 0:
        for i in range(gap,n):
            temp=array[i]
            j=i
            while j>=gap and array[j-gap]>temp:
                array[j]=array[j-gap]
                j-=gap
            array[j]=temp
        gap//=2

#生成10000个值在0~10000的随机数
myList=[random.random()*10000 for i in range(10000)]
start_time=time.time()
shell_sort(myList)
print(myList)
#统计使用时间
print(f"--- {time.time() - start_time} seconds ---")

总用时0.07192134857177734 seconds

复杂度分析

步长的选择时希尔排序的重要部分,步长选择不同,最坏时间复杂度不同。当步长为2时,最坏时间复杂度为O(N^2),当步长为2时,希尔排序会将相隔一个步长的元素分为一组,并对每个组进行插入排序。然后,步长减半,再次进行分组和插入排序。这个过程会持续进行,直到步长减至1,此时就变成了普通的插入排序。在最坏情况下,当列表中的元素按照逆序排列时,每个元素都需要在前面的已排序部分中逐个向前移动,直到找到合适的插入位置。这导致每个元素都需要进行大量的比较和移动操作。因此,当步长序列为2时,希尔排序的最坏时间复杂度为O(n^2)。

image-20240316182001142

Share

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Post comment

 ©2025 [忧郁小王子的乌托邦] - 稳定运行: