排序数组
难度:中等
给你一个整数数组 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