三路排序算法

一、概念及其介绍

三路快速排序是一个基于双路快速排序的改进版本,其目的是处理包含大量重复元素的数组。这个算法将数组划分为三个部分:小于标定值 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)

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子边缘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值