深入解析三路快排:一种高效的排序算法

news2025/7/17 10:01:41

在数据结构和算法的世界中,快排(Quick Sort)无疑是最受欢迎的排序算法之一。今天,探讨一种优化的快排变体——三路快排(3-Way Quick Sort),它在处理具有重复元素的数组时展现出了令人惊叹的效率。

1. 快排的基本概念

在深入三路快排之前,我们首先复习一下经典的快排算法。快排由C.A.R. Hoare于1960年提出,它采用分治策略,通过选择一个基准元素(pivot),将数组分成两部分:一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。

快排的基本步骤如下:

  • 选择基准元素:通常选择数组的第一个、最后一个或中间的元素作为基准。
  • 分区操作:将数组分成两部分,一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素。
  • 递归排序:对分出的两部分分别递归地应用快排。

2. 三路快排的动机与改进

在经典的快排中,当遇到大量重复元素时,分区操作会变得非常不高效,导致性能下降。三路快排则通过对重复元素进行特殊处理来解决这个问题。

为什么需要三路快排?

在处理大量重复元素的数组时,经典的快排可能会表现得非常低效,因为重复元素会导致很多不必要的比较和交换。三路快排通过将数组分为三个区域来优化这一点:

  • 小于基准元素的区域
  • 等于基准元素的区域
  • 大于基准元素的区域

这种分区方法减少了重复元素的处理次数,提高了效率。如图:
在这里插入图片描述

三路快排的步骤

  1. 选择基准元素:选择一个基准元素(随机选取,并与第一个元素交换)。
  2. 分区操作:使用三个指针(lt, i, gt)来划分数组:
    • lt指向小于基准的区域的边界
    • i是当前元素的索引
    • gt指向大于基准的区域的边界
  3. 交换元素:
    • 如果当前元素小于基准,将其移动到小于区域,更新lt和i。
    • 如果当前元素等于基准,将其保持在中间区域,更新i。
    • 如果当前元素大于基准,将其移动到大于区域,更新gt。

举例说明

原始数组如下:
在这里插入图片描述
步骤1: 假设我的随机取的下标是3,将它与第一个元素交换位置,交换后原数组不变
在这里插入图片描述
步骤二:初始化三个指针
在这里插入图片描述
步骤三:交换元素
2比基准值5小,交换位置swap(i,lt),然后lt,i分别向右移动
在这里插入图片描述
3比基准值5小,交换位置swap(i,lt),然后lt,i分别向右移动
在这里插入图片描述
5和基准值5相等,向右移动i
在这里插入图片描述
在这里插入图片描述
7比基准值5大,交换位置swap(i,gt),gt向左移动
在这里插入图片描述
8比基准值5大,交换位置swap(i,gt),gt向左移动
在这里插入图片描述
至此,我们把比基准值小的数放在索引小于lt的位置,比基准值大的放在索引>gt的位置上,[lt, gt]是等于基准值的
在这里插入图片描述

3. 代码实现:

/**
 * 三路快速排序
 * 三路快速排序是快速排序的一种优化,它将数组分为三个部分:
 * 小于基准值的元素、等于基准值的元素和大于基准值的元素。
 * 这样可以减少递归深度,提高排序效率。
 * 
 * @param arr 待排序的数组
 * @param low 子区间的起始索引
 * @param high 子区间的结束索引
 */
public void threeWayQuickSort(int[] arr, int low, int high) {
    // 当起始索引大于等于结束索引时,无需排序,直接返回
    if (low >= high) {
        return;
    }

    // 随机选择一个索引作为基准值的索引
    int v = (int)(Math.random() * (high - low + 1) + low);
    // 将基准值交换到区间起始位置
    swap(arr, low, v);
    // 获取基准值
    int pivot = arr[low];
    // 初始化小于基准值的边界
    int lt = low;
    // 初始化当前比较位置
    int i = low + 1;
    // 初始化大于基准值的边界
    int gt = high;

    // 遍历数组,直到当前比较位置与大于基准值的边界相遇
    while (i <= gt) {
        if (arr[i] < pivot) {
            // 当前元素小于基准值,将其与小于边界后的元素交换,并移动小于边界和当前比较位置
            swap(arr, lt, i);
            lt++;
            i++;
        } else if (arr[i] > pivot) {
            // 当前元素大于基准值,将其与大于边界的元素交换,并移动大于边界
            swap(arr, i, gt);
            gt--;
        } else {
            // 当前元素等于基准值,直接移动到下一个位置
            i++;
        }
    }
    // 递归地对小于基准值的部分和大于基准值的部分进行排序
    threeWayQuickSort(arr, low, lt - 1);
    threeWayQuickSort(arr, gt + 1, high);
}

4. 性能分析

时间复杂度

在最坏情况下(例如所有元素相等),三路快排的时间复杂度仍然是O(n log n),与经典的快排相同。但在处理重复元素时,它通常比经典快排更具优势。

空间复杂度

三路快排的空间复杂度为O(log n),因为它使用了递归栈来进行排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCIe学习笔记(22)

Transaction Ordering Transaction Ordering Rules 表2-40定义了PCI Express Transactions的排序要求。该表中定义的规则统一适用于PCI Express上所有类型的事务&#xff0c;包括内存、I/O、配置和消息。该表中定义的排序规则适用于单个流量类(TC)。不同TC标签的事务之间没有…

Label-Wise Graph Convolutional Network for Heterophilic Graphs

推荐指数: #paper/⭐⭐ 发表于:LoG 2022 推荐指数是因为22年,所以给2行. 贡献:用MLP来区分不同的标签信息. 思想阐述: 假设 N k ( v ) \mathcal{N}_{k}(v) Nk​(v)表示节点v标签为k的邻居.我们定义基于 a v , k a_{v,k} av,k​为聚合标签为k的邻居:(即只聚合标签为k的邻居) a…

拒绝内卷:利用4P营销理论打造汇报PPT

在当下的职场文化里&#xff0c;越来越激烈的“内卷”现象普遍存在。随着不得已的竞争压力、加班文化、以及技能和学历的通货膨胀&#xff0c;越来越多职场人不惜加大工作负荷和劳动投入。但这种过度的付出往往并未带来成比例的回报&#xff0c;有时还会因为过度工作而导致生产…

Oracle Java JDK 21 下载地址及安装教程

Oracle JDK 21 官方地址 https://www.oracle.com/java/technologies/downloads/#java21 1. Linux 版本 ARM64 Compressed Archive https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz ARM64 RPM Package https://download.oracle.com/java/21/late…

OpenHarmony网络协议通信—nanopb

简介 nanopb是一种小代码量的协议缓冲区实现&#xff0c;适用于任何内存受限的系统。 下载安装 直接在OpenHarmony-SIG仓中搜索nanopb并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 将下载的Nanopb库代码存在以下路径&#xff1a;./third_party/nanopb 修改添…

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道&#xff1a;上周8月5日&#xff0c;美国法院裁定谷歌的搜索业务违反了美国反垄断法&#xff0c;非法垄断在线搜索和搜索文本广告市场。据悉&#xff0c;胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据&#xff0c;以及防止其在人工智…

C# Log4net日志 配置 与AppenderSkeleton

https://www.cnblogs.com/yaopengfei/p/9428206.html 一、Log4Net简介 Log4net是从Java中的Log4j迁移过来的一个.Net版的开源日志框架&#xff0c;它的功能很强大&#xff0c;可以将日志分为不同的等级&#xff0c;以不同的格式输出到不同的存储介质中&#xff0c;比如&#x…

Vue框架学习笔记-6

Vue中的路由 Vue中的路由&#xff08;Routing&#xff09;是通过Vue Router这个官方提供的路由管理器来实现的。Vue Router允许你通过不同的URL访问应用中不同的页面&#xff08;组件&#xff09;&#xff0c;而无需重新加载页面。这对于构建单页应用&#xff08;SPA, Single …

数字引领风尚·智能改变生活“青岛电博会”路演活动(济南站)

2024CICE中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;成功举行 数字引领风尚&#xff0c;智能改变生活。 8月7日&#xff0c;50余家行业协会、企业嘉宾、展商代表等云集2024中国国际消费电子博览会路演活动&#xff08;济南站&#xff09;现场&#xff0c;共…

【香菇带你学Mysql】Linux下Mysql8使用二进制安装包安装教程【建议收藏】

⚠️ 本人声明&#xff1a;本教程可100%复现​ 网上看了很多Mysql8安装的方式&#xff0c;基本上都是都过一个yum方式直接访问公网下载依赖资源安装的。 但是在企业内部一般并不允许生产环境直接连接公网。针对此情况。本文将介绍如何在内网环境下使用二进制安装包本地安装方式…

【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁

文章目录 乐观锁和悲观锁重量级锁和轻量级锁挂起等待锁和自旋锁公平锁和非公平锁可重入锁和不可重入锁读写锁相关面试题 锁&#xff1a;非常广义的概念&#xff0c;不是指某个具体的锁&#xff0c;所有的锁都可以往这些策略中套 synchronized&#xff1a;只是市面上五花八门的锁…

新形势下职业教育云计算人才培养策略

一、引言 在数字化转型的浪潮中&#xff0c;云计算作为核心技术之一&#xff0c;正在深刻影响着各行各业的发展。职业教育作为培养技术技能型人才的重要途径&#xff0c;需要紧跟时代步伐&#xff0c;不断优化和创新云计算人才培养模式&#xff0c;以满足社会对云计算人才的迫…

基于MyBatis-plus的SpringBoot开发

目录 一、SpringBoot整合mybatis 二、SpringBoot整合mybatis-plus 1、什么是mybatis-plus&#xff1f; 2、mybatis-plus的特性 3、mybatis-plus的使用 &#xff08;1&#xff09;编写注解配置实体类与关系表映射关系 &#xff08;2&#xff09;mapper层 &#xff08;3…

Sandbox: rsync.samba(80134) deny(1) file-write-create

Xcode15运行报错:Sandbox: rsync.samba(80134) deny(1) file-write-create/xxx/xxx 如下图: 解决办法: Build Settings 搜索 sandbox&#xff0c;把 Build Options 中的 User Script Sandboxing改为 NO

iPhone很多空相簿怎么删除:简化你的照片库

随着我们使用iPhone拍摄越来越多的照片和视频&#xff0c;管理这些内容的需求也随之增加。创建相簿是组织照片的一种便捷方式&#xff0c;但随着时间的推移&#xff0c;可能会产生许多未使用或空的相簿。这些空相簿不仅占用了照片应用的界面空间&#xff0c;也让照片库显得更加…

代码随想录算法训练营第四十二天|广度优先搜索理论基础、岛屿数量:深搜版、岛屿数量:广搜版

广度优先搜索理论基础 广搜&#xff08;bfs&#xff09;是一圈一圈的搜索过程。因为广搜是从起点出发&#xff0c;以起始点为中心一圈一圈进行搜索&#xff0c;一旦遇到终点&#xff0c;记录之前走过的节点就是一条最短路。 广搜的过程&#xff1a;我们从图中可以看出&#x…

HTML+CSS进阶用法(上)——平面转换、渐变、空间转换

欢迎来到CSS变换的世界&#xff0c;这里充满了创意和可能性。在本篇博客中&#xff0c;我们将一起学习如何使用transform属性来实现各种平面和空间转换效果&#xff0c;包括位移、旋转、缩放&#xff0c;以及如何通过渐变和动画来增强我们的网页设计。无论你是初学者还是有经验…

【区块链+金融服务】基于区块链的区域股权金融综合服务平台 | FISCO BCOS应用案例

区域性股权市场是我国资本市场的重要组成部分&#xff0c;是多层次资本市场体系的基石。区块链技术与区域性股权市场 分散特征天然匹配&#xff0c;从新型金融基础设施层面为场外参与各方提供公共的可信服务&#xff0c;以技术手段完善市场基础条 件&#xff0c;弥补区域性短板…

仿RabbiteMq实现简易消息队列正式篇(需求分析)

TOC 目录 MQ的实现方法 RabbitMq中的相关概念 消息队列系统模块划分 总体划分 服务端模块 数据管理模块 虚拟机数据管理模块 交换机路由模块 消费者管理模块 信道&#xff08;通信&#xff09;管理模块 连接管理模块 服务端BrokerServer模块 客户端模块 消费者管…

iPhone 16 机模视频曝光,五种颜色各有千秋

科技博主的最新视频分享了苹果 iPhone 16 标准版的机模上手体验。 视频中展示了五种颜色的 iPhone 16&#xff1a;深邃的蓝色、柔和的粉色、纯净的白色、经典的黑色和生机勃勃的绿色。 与 iPhone 15 相比&#xff0c;iPhone 16 弃用了黄色&#xff0c;新增了白色&#xff0c;…