【算法——Python实现】快速排序的优化:三路快速排序及Leetcode题目应用

相比于普通的快速排序,优化点在于:
1.解决数组近乎有序的情况下算法复杂度会退化为O(n2)级别的问题
2.解决数组中有大量重复元素带来的复杂度退化问题

import random


def quicksort(arr, left, right):
    # 只有left < right 排序
    if left < right:
        # pivot_index = partition(arr, left, right)
        random_index = random.randint(left, right)
        arr[left], arr[random_index] = arr[random_index], arr[left]
        pivot = arr[left]
        lt = left # arr[left+1...lt] < v
        gt = right + 1 # arr[gt...right] > v
        i = left + 1 # arr[lt+1...i] == v
        while i < gt:
            if arr[i] < pivot:
                arr[i], arr[lt+1] = arr[lt+1], arr[i]
                lt += 1
                i += 1
            elif arr[i] > pivot:
                arr[i], arr[gt-1] = arr[gt-1], arr[i]
                gt -= 1
            else:
                i += 1
        arr[left], arr[lt] = arr[lt], arr[left]
        quicksort(arr, left, lt-1)
        quicksort(arr, gt, right)

Leetcode题目应用:
第75题 Sort Colors
给定一个有n个元素的数组,数组中元素的取值只有0,1,2三种可能,为这个数组排序。

class Solution(object):
    def sortColors(self, nums):
        # 运用三路快速排序思路,只对数组遍历一遍
        # 时间复杂度O(n),空间复杂度O(1)
        zero = -1  # nums[0...zero] == 0
        two = len(nums)  # nums[two...n-1] == 2
        i = 0  # nums[zero+1...i] == 1
        while i < two:
            if nums[i] == 0:
                nums[i], nums[zero + 1] = nums[zero + 1], nums[i]
                zero += 1
                i += 1
            elif nums[i] == 2:
                nums[i], nums[two - 1] = nums[two - 1], nums[i]
                two -= 1
            else:
                i += 1

你可能感兴趣的:(算法——Python实现)