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

来源:互联网 发布:学生成绩数据表格 编辑:程序博客网 时间:2024/06/05 19:05

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

import randomdef 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
阅读全文
0 0
原创粉丝点击