[排序] 希尔排序(Python)

本文详细介绍了希尔排序算法,它是直接插入排序的一种改进版本,通过引入增量序列的概念,将原始序列分成多个子序列分别进行排序,从而提高了排序效率。文章还提供了具体的排序示例和两种不同的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思想

希尔排序(Shell)是直接插入排序的优化版本,实现了时间复杂度突破 O(n2) ,策略在于不断分组并在组内进行直接插入排序。那么如何分组呢?这里提出一个概念——增量序列,希尔增量 {n/2,n/4,...,1}(n) 就是一种增量序列,增量序列里的元素称为gap。我们依次把序列分为 n/2 组, n/4 组,…,1组,即不断缩小gap,不断分组并排序,最终使序列有序。因为希尔排序涉及分组和直接插入排序,元素的前后顺序可能发生改变,所以是不稳定的排序。

示例

对序列[7,6,4,3,1,2,8,5]按升序排列。

gap分组组内排序过程排序结果
4[7,1],[6,2],[4,8],[3,5][1,7],[2,6],[4,8],[3,5][1,2,4,3,7,6,8,5]
2[1,4,7,8],[2,3,6,5][1,4,7,8],[2,3,5,6][1,2,4,3,7,5,8,6]
1[1,2,4,3,7,5,8,6][1,2,3,4,5,6,7,8][1,2,3,4,5,6,7,8]

代码

class Solution:
    # @param {int[]} A an integer array
    # @return nothing
    def swap(self, A, i, j):
        tmp = A[j]
        A[j] = A[i]
        A[i] = tmp

    # 交换法进行插入排序
    def sortIntegers(self, A):
        # Write your code here
        if len(A) <= 1:
            return
        gap = len(A) / 2
        while gap > 0:
            for i in range(gap, len(A)):
                j = i
                while j - gap >= 0 and A[j] < A[j - gap]:
                    # 交换法进行插入排序
                    self.swap(A, j, j - gap)
                    j -= gap
            gap /= 2

    # 移动法进行插入排序
    def sortIntegers1(self, A):
        # Write your code here
        if len(A) <= 1:
            return
        gap = len(A) / 2
        while gap > 0:
            for i in range(gap, len(A)):
                j = i
                if A[j] < A[j - gap]:
                    tmp = A[j]
                    while j - gap >= 0 and tmp < A[j - gap]:
                        # 移动法进行插入排序
                        A[j] = A[j - gap]
                        j -= gap
                    A[j] = tmp
            gap /= 2

时间复杂度

希尔排序的时间复杂度和增量序列有关,希尔增量时间复杂度为 O(n2) ,Hibbard增量时间复杂度为 O(n3/2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值