75. 颜色分类

在这里插入图片描述

解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
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值