算法刷题打卡第53天:排序数组---希尔排序

排序数组

难度:中等

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

希尔排序

思路:
一种基于插入排序的快速的排序算法。简单插入排序对于大规模乱序数组很慢,因为元素只能一点一点地从数组的一端移动到另一端。

希尔排序为了加快速度简单地改进了插入排序,也称为缩小增量排序,同时该算法是冲破 O ( n 2 ) O(n^2) O(n2) 的第一批算法之一。

希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序,然后缩小增量继续分组排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,再次排序,完成整个数组的排序。这个不断缩小的增量,就构成了一个增量序列。

希尔排序(降序)图示:

在这里插入图片描述
我们选择增量 gap=length/2,缩小增量继续以 gap = gap/2 的方式,于是形成的增量序列为 {7,3,1}。

第一个增量为7,则原始数组被分为7组,组内的每个元素之间数组下标之差为7,这7组分别进行插入排。

在这里插入图片描述

第二个增量为3,则第一次排序后数组被分为3组,组内的每个元素之间数组下标之差为3,这3组分别进行插入排序。

在这里插入图片描述

第三个增量为1,则第二次排序后数组被分为1组,进行插入排序。

在这里插入图片描述

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),最好的情况为 O ( n 1.3 ) O(n^{1.3}) O(n1.3),最坏的情况为 O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( 1 ) O(1) O(1)

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        # 记录数组长度
        length = len(nums)
        # 记录增量长度
        interval = len(nums) // 2
        # 增量为0时候,退出循环
        while interval > 0:
            # 进行分组插入排序
            for i in range(interval):
                index = i
                while index < length:
                    sort_index, sort_value = index, nums[index]
                    while sort_index > 0 and sort_value < nums[sort_index - interval]:
                        nums[sort_index] = nums[sort_index - interval]
                        sort_index -= interval
                    nums[sort_index] = sort_value
                    index += interval
            interval //= 2
        return nums  

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sort-an-array

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值