返回
将快排思想融入代码,探索 LeetCode 912 的巧妙解法
前端
2024-01-14 13:32:33
刷题打卡 | LeetCode 912. 排序数组(快排思想)
快速排序,顾名思义,以其闪电般的速度和高效的算法,成为程序员们解决排序问题的利器。今天,我们就将快排思想融入代码,踏上 LeetCode 912 的解题之旅。
算法思想
快排的关键在于分而治之。它将待排序数组划分为两个子数组,左边的子数组小于或等于一个特定的元素(称为分隔点),而右边的子数组大于分隔点。然后,递归地对这两个子数组进行相同的操作,直到它们被完全排序。
代码实现
def sortArray(nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
# 如果数组长度为 0 或 1,则直接返回
if len(nums) <= 1:
return nums
# 设置分隔点为数组的第一个元素
pivot = nums[0]
# 初始化两个指针,i 指向小于或等于分隔点的元素,j 指向大于分隔点的元素
i, j = 0, len(nums) - 1
while i < j:
# 如果 nums[i] > pivot,则将 nums[i] 和 nums[j] 交换
if nums[i] > pivot:
nums[i], nums[j] = nums[j], nums[i]
j -= 1
# 如果 nums[i] <= pivot,则 i++
else:
i += 1
# 将分隔点放入正确的位置
nums[i], nums[0] = nums[0], nums[i]
# 递归地对两个子数组进行排序
return sortArray(nums[:i]) + [nums[i]] + sortArray(nums[i+1:])
妙用 do, while
仔细观察代码,我们会发现 i++ 和 j-- 的操作。这是为了使 do, while 循环能够先执行一次循环体,然后再检查条件。这样,就可以保证 i++ 和 j-- 始终先执行一次,然后再判断是否满足条件。
实例详解
让我们以一个示例数组 [5, 2, 3, 1] 来演示算法。
- 以第一个元素 5 作为分隔点。
- i = 0, j = 3。
- nums[i] > pivot,交换 nums[i] 和 nums[j]。i = 0, j = 2。
- nums[i] > pivot,交换 nums[i] 和 nums[j]。i = 0, j = 1。
- nums[i] <= pivot,i++。i = 1, j = 1。
- nums[i] <= pivot,i++。i = 2, j = 1。
- i >= j,循环结束。
- 分隔点 5 放入正确的位置。
- 递归地对 [2, 3, 1] 和 [5] 进行排序。
最终,排序后的数组为 [1, 2, 3, 5]。
总结
通过将快排思想融入代码,我们高效地解决了 LeetCode 912 问题。分而治之的策略和 do, while 循环的巧妙运用,使代码简洁高效。希望这次解题之旅能为你的刷题之路添砖加瓦。