一、概念及其介绍
三路快速排序是一个基于双路快速排序的改进版本,其目的是处理包含大量重复元素的数组。这个算法将数组划分为三个部分:小于标定值 v、等于 v 和大 v。
二、适用说明
三路快速排序和随机化快速排序的复杂度是相同的。它们的平均时间复杂度为O(n log n),最坏情况下为O(n^2)。空间复杂度为O(log n)。
通过三路快速排序,相同元素被集中在一起,减少了重复元素的重复比较和交换操作。因此,三路快速排序在处理包含大量重复元素的数组时,能够提高性能。
三、过程图示
我们分三种情况进行讨论 partiton 过程,i 表示遍历的当前索引位置:
(1)当前处理的元素 e=V,元素 e 直接纳入蓝色区间,同时i向后移一位。
(2)当前处理元素 e<v,e 和等于 V 区间的第一个位置数值进行交换,同时索引 lt 和 i 都向后移动一位
(3)当前处理元素 e>v,e 和 gt-1 索引位置的数值进行交换,同时 gt 索引向前移动一位。
最后当 i=gt 时,结束遍历,同时需要把 v 和索引 lt 指向的数值进行交换,这样这个排序过程就完成了,然后对 <V 和 >V 的数组部分用同样的方法再进行递归排序。
# 导入random模块
import random
# 三路快速排序
class QuickSort3Ways:
def sort(self, arr):
self.__quick_sort_3ways(arr, 0, len(arr) - 1)
def __quick_sort_3ways(self, arr, l, r):
if l >= r:
return
self.swap(arr, l, random.randint(l, r))
v = arr[l]
lt = l
gt = r + 1
i = l + 1
while i < gt:
if arr[i] < v:
self.swap(arr, i, lt + 1)
i += 1
lt += 1
elif arr[i] > v:
self.swap(arr, i, gt - 1)
gt -= 1
else:
i += 1
self.swap(arr, l, lt)
self.__quick_sort_3ways(arr, l, lt - 1)
self.__quick_sort_3ways(arr, gt, r)
def swap(self, arr, i, j):
arr[i], arr[j] = arr[j], arr[i]
# 测试 QuickSort3Ways
if __name__ == "__main__":
N = 10
arr = [random.randint(0, 100) for _ in range(N)]#由于不需要使用循环变量,所以用下划线_表示
print("排序前:",arr)
qsort = QuickSort3Ways()
qsort.sort(arr)
print("排序后:",arr)