解1 快速排序
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
self.quick_sort(nums, 0, n - 1)
def quick_sort(self, nums, start, end):
l = start
r = end
if l >= r:
return
mid = nums[l]
while l < r:
while l < r and nums[r] >= mid:
r -= 1
nums[l] = nums[r]
while l < r and nums[l] < mid:
l += 1
nums[r] = nums[l]
nums[l] = mid
self.quick_sort(nums, start, l - 1)
self.quick_sort(nums, l + 1, end)
三路快排
如果 =v 部分元素非常多,那么我们的三路快速排序算法效果就会越明显,这也正是他的优点所在。
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
self.three_quick_sort(nums, 0, n - 1)
def three_quick_sort(self, nums, start, end):
l = start
r = end
if l >= r:
return
# 存入当前基准值 v
mid = nums[l]
# 当前遍历索引
i = l + 1
# < v 的最后一个位置索引
lt = l
# > v 的第一个位置索引
gt = r + 1
while i < gt:
if nums[i] == mid:
i += 1
elif nums[i] < mid:
nums[i], nums[lt + 1] = nums[lt + 1], nums[i]
lt += 1
i += 1
else:
nums[i], nums[gt - 1] = nums[gt - 1], nums[i]
gt -= 1
# 交换 l 与 lt
nums[l], nums[lt] = nums[lt], nums[l]
# 维护lt定义
lt -= 1
self.three_quick_sort(nums, start, lt)
self.three_quick_sort(nums, gt, end)
优化
本题中只有三个数 0 1 2 利用三路快排,将1作为基准值v,只需扫描一遍数组,不需要递归 <v 部分和 >v 部分
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
self.three_quick_sort(nums, 0, n - 1)
def three_quick_sort(self, nums, start, end):
l = start
r = end
if l >= r:
return
# 将 1 作为基准值 v
mid = 1
# 当前遍历索引
i = l
# 0 的最后一个位置索引
lt = l - 1
# 2 的第一个位置索引
gt = r + 1
while i < gt:
if nums[i] == mid:
i += 1
elif nums[i] < mid:
nums[i], nums[lt + 1] = nums[lt + 1], nums[i]
lt += 1
i += 1
else:
nums[i], nums[gt - 1] = nums[gt - 1], nums[i]
gt -= 1