了解一下:快速排序改进版——三向分切快速排序

算法学习笔记:三向切分快速排序 在出现较多重复元素时,对于归并排序性能并不会受到影响,但是对于快速排序时间复杂度会由线性对数级别到达平方级别。 出现这一性能下降的原因是对于传统快速排序,每一次切分会将数组分为两部分,这两部分长度越接近效率越高,而在最糟情况,即所有元素值相等,快速排序切分的一部分长度将只有1,导致需要切分N此才能完成,另外每一次分区又要遍历数组,总时间复杂度为for(int i = 0; i < N; i++) {i} (不知道连加符号电脑上怎么打,且拿for循环表示) 三向切分的快速排序: 解决大量重复键的一个方法 阅读详情

文章首发地址
三向分切快速排序(3-way Quicksort)是一种改进的快速排序算法,用于处理重复元素较多的情况。

传统的快速排序算法通常选择数组中的一个元素作为切分元素(pivot),并将数组划分为两个部分:比切分元素小的元素在左边,比切分元素大的元素在右边。然后对左右两部分分别进行递归排序。

但是当数组中有大量重复元素时,传统的快速排序算法性能会下降。因为在划分过程中,相同的元素会被分到不同的部分,导致重复元素的比较和交换次数增多。

三向分切快速排序则通过将数组划分为三个部分,避免了上述问题。具体来说,三向分切快速排序将数组划分为:

  1. 小于切分元素的部分;
  2. 等于切分元素的部分;
  3. 大于切分元素的部分。

然后对小于和大于切分元素的部分分别递归排序,等于切分元素的部分可以直接跳过,因为它们已经排好序了。

三行分切排序轨迹图:
在这里插入图片描述
在这里插入图片描述
三向分切快速排序的实现如下:

void quicksort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot = arr[left];
    int i = left + 1;
    int lt = left; // 小于切分元素的部分的右边界
    int gt = right; // 大于切分元素的部分的左边界
    while (i <= gt) {
        if (arr[i] < pivot) {
            swap(arr, i++, lt++);
        } else if (arr[i] > pivot) {
            swap(arr, i, gt--);
        } else {
            i++;
        }
    }
    quicksort(arr, left, lt - 1);
    quicksort(arr, gt + 1, right);
}

void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

在上述代码中,lt和gt分别表示小于和大于切分元素的部分的边界。初始化时,它们分别为左右端点。i则用来扫描数组,将元素划分到相应的部分中。

具体来说,当扫描到的元素小于切分元素时,将它与小于部分的右边界交换,并将小于部分的右边界向右移动一位。当扫描到的元素大于切分元素时,将它与大于部分的左边界交换,并将大于部分的左边界向左移动一位。当扫描到的元素等于切分元素时,将i向右移动一位即可。

最后,递归地对小于和大于切分元素的部分进行排序即可。

三向分切快速排序在处理重复元素较多的情况下,比传统的快速排序算法具有更好的性能。但是它的空间复杂度为O(n),因为需要开辟额外的空间来存储等于切分元素的元素。

改进版快速排序——从10万个数里面选出最小的10个 【学习笔记】 改进版快速排序 昨天手撕了原始快速排序的基本算法,一直在思考这些基础算法的使用场景,今天分享一个改进版的快速排序算法,用于对数字进行快速部分排序,举个例子:从10万个无序的数里面选出最小的10个并有序输出。适合用到以下改进版快速排序的思想: Talk is cheap,show the code~ package sort; import org.junit.Test; /** * 改进版快速排序 * @author jsyuger * 该类为原始快速排序算法的改进版实现, 阅读详情

相关推荐

Lisp实现快速排序

学习语言的过程就是练习语言的过程。快速排序作为20世纪十大算法之一,看看使用lisp如何实现。在实现快速排序的时候,本文实现的三向快速排序。在较老的Unix系统中的qsort函数实际上存在毛病,即当待排序的数据中存在大量的重复数据,快速排序仍然需要执行很长的时间。这个bug在很久之后才被发现。随后Dijkstra提出三向快速排序算法,相对与传统的快速排序需要两个索引,三向快速排序需要三个索引。

Sands make life richful. 4196

【算法理解】—— 快速排序(三向切分)

针对于“快速排序”算法的一个介绍,并对快速排序的优化版——“快速排序(三向切分)”做一个介绍。

鸡蛋的专栏 8371

三向字符串快速排序——python实现

三向字符串快速排序——python实现为啥写这个三向字符串快速排序是什么新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为啥写这个 因为yh老师布置了这个高算作业,可怜我的国庆假期就这么没了,不过能有所得总是好的 三向字符

LareinaLiang的博客 655

排序算法07:三向快速排序

算法介绍  在上一篇排序算法06:快速排序中,可以知道,快速排序不停的递归切分数组。在有大量的重复元素情况下,这样的切分存在巨大的改进空间。三向切分的快速排序就是为了提升在有大量重复元素情况下快速排序的性能。  快速排序把数组切分为两部分,分别对应与小于,大于切分元素的数组元素。而三向切分将数组切分为三部分,分别对应小于,等于,大于切分元素的数组元素。  三向切分的快速排序的算法逻辑为:从左到右遍历

YiYing's sharing 1501

三向切分快速排序+插入排序

快速排序的优化想法,对于三向切分排序的实践(文件中附 快速排序的 二向 三向切分、插入排序代码)(见 https://github.com/Zhangxuan-Xing/Quicksort-ThreeWay ,欢迎 关注 star)

基于PLC的冲压件自动生产线电气系统设计【附数据】

考虑到生产线的高效运行和维护简便性,选择了三菱FX系列的可编程逻辑控制器(PLC)作为核心控制单元,该型号的PLC因其高可靠性和强大的功能集,在工业自动化领域有着广泛的应用。最后,在完成初步的软件开发后,进行了多轮次的模拟测试和现场调试,逐步修正了存在的问题,最终达到了预期的功能要求。例如,对于进料环节,选用了光电传感器以精确检测物料的位置;此外,为了适应不同尺寸的工件加工需求,还特别设计了一套可调节的夹具系统,不仅提高了生产线的灵活性,同时也降低了更换模具的成本。✅ 感恩科研路上每一位志同道合的伙伴!

lagougongzuoshi的博客 1292

快速排序(包括三向切分的快速排序)

快速排序 一.对比归并排序和快速排序 快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序是当两个子数组都有序的情况时整个数组也就自然有序了。归并排序递归调用发生在处理整个数组之前,快速排序递归调用发生在处理整个数组之后。在归并排序中,一个数组被等分成两半;在快速排序中,切分的位置取决于数组的内容。 二.代码 public class Quick { publi

weixin_49894931的博客 430

3分钟搞懂欧式距离变换(EDT):从暴力算法到Felzenszwalb的演进史

本文系统梳理了欧式距离变换(EDT)从暴力算法到高效线性算法的演进历程。重点解析了光栅扫描算法和Felzenszwalb算法的核心思想与实现,并探讨了其在机器人路径规划中生成欧几里得符号距离场(ESDF)的关键应用,为开发者提供了清晰的算法选型与实战指南。

fern8的博客 976

快速排序及三向切分快速排序

1.快速排序  是一种分治的排序算法。切分元素的选择关系到算法的性能,因此在排序前,应先把数据打乱。 2.快速排序的过程:  1). 选择切分元素(一般选择切分区域第一个位置 k )。   2). i 指向第二个元素(第一个 k ),j指向最后一个元素。   3). i 向右移动,遇到大于等于切分元素 k 的元素时,停下。   4). j 向左移动,遇到小于等于 k 的元素时,停下。

i.sshe的博客 3579

SQL2000在Win10上安装完整指南:兼容模式、SP4补丁与远程连接配置

数据库兼容性是老系统迁移与运维中绕不开的难题。当历史遗留的SQL Server 2000遭遇全新的Windows 10环境,安装程序常因系统版本检测失败而拒绝运行,这背后是旧版安装程序与NT内核版本间的识别错位。通过兼容模式模拟旧系统环境、以管理员身份运行安装程序,并处理注册表挂起与杀毒软件干扰,即可突破基础安装障碍。安装后的SP4补丁与TCP/IP端口配置,则是保障服务稳定与远程连接的关键。这一技术路径广泛适用于制造企业MES、进销存系统及医院HIS等仍依赖老旧数据库的场景,为IT运维与数据迁移测试提供了

weixin_29266679的博客 441

排序算法(三):快速排序和三向快速排序

快速排序 快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立的排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当两个子数组都有序时整个数组也就自然有序了。在归并排序中,递归调用发生在处理整个数组之前,而快速排序中,递归调用发生在处理整个数组之后。 快速排序算法是最快的通用排...

acy29712的博客 253

Cursor 使用教程(2025年更新版)

官方Cursor详细使用教程在“扩展学习”

我是赛博AI Lewis 7082

快速排序的优化-三值取中法

本文主要讲解了快速排序的一种优化方法——三数取中法和一种新的取中函数的设计方式。

勇敢的喵的博客 1415

无人机芯片模块技术要点分析

恶劣环境下信号稳定性:无人机在恶劣环境下工作时,遥感系统采集的信号往往很不稳定,视频信号处理芯片需要具备强抗干扰能力,能辨别脉冲脉宽为50ns以上、幅度为0V~4.5V的输入信号。这种架构能兼顾强大的运算能力和灵活的接口控制。芯片小型化:麻省理工学院的研究人员已设计出仅20平方毫米的微型芯片,可处理无人机飞行所需的惯性数据和相机图像,为微型无人机的发展奠定了基础。光子集成芯片(PIC) :研究显示,与电子芯片相比,光子计算芯片在延迟、计算容量和能效上都有数量级的提升,有望解决当前无人机系统的计算瓶颈。

YUNZHUO666的博客 1404

基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢

amy_mhd的博客 689

改进版快速排序算法详解及实现(内附完整代码及注释)

本文介绍了快速排序算法的C++实现,重点讲解了其分治思想和三数取中优化方法。文章阐述了算法的核心流程:选取基准值、左右双指针遍历、分区交换和递归处理。针对不同场景给出了使用建议,指出在嵌入式系统需考虑内存限制(推荐SRAM≥32KB)。提供了完整代码实现,包含三数取中函数、递归排序逻辑和正/逆序支持,并建议小数据量时可简化基准值选取以提高效率。最后通过测试案例验证了算法正确性。

人生的意义在于新的经历 650

Linux 配置 multipath 多路径

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3298

算法笔记4:快速排序

快速排序标准快速排序三取样切分和小段插入排序的快速排序 标准快速排序 import edu.princeton.cs.algs4.StdRandom; /** * 标准快速排序 * @author XY * */ @SuppressWarnings("rawtypes") public class QuickSort { public static void sort(Compara...

SGT的博客 527

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++实现快速排序改进版

快速排序的几种改进实现,含代码

weixin_49047811的博客 564

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

三向字符串快速排序

#include #include #include //三向字符串快速排序 //基于快速排序的思想,依据键值进行比较,划分为小于当前 //键值、等于当前键值、大于当前键值的3个子组,之后采用递 //归方法分别对3个子组再次进行排序。由于等于当前键值的子 //组所有键都已经相同,所以无需再比较当前键值,而选取下 //一列索引字符做为键值。 // //如下示例所示,最初仅有一个排序组,有6

技术人生 1892

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

快速排序改进版

import java.util.Arrays; public class QuickSort { public static void quickSort(int[] arr) { if (arr == null || arr.length < 2) { return; } quickSort(arr, 0, arr.length - 1); } public...

赵智任的博客 711

【手写系列】快速排序

快速排序对于程序员来说太重要,值得好好学习了理解, 我也是花了一上午才研究明白。重要的已经写在代码里,直接看注释把。 普通版快排: /** * @author Jay * @date 2020/7/13 11:27 * 选择排序 * @Description:快速排序基础版 * 时间复杂度和分组的次数和趟数有很大关系 * 不足点:当为逆数组时,每趟下来,下次会造成分组只有一个,就会走n-1趟 * 常规就不然,所有需要改进。 * */ public class quickSortNormal

Jay的博客 330

快速排序

快速排序

落枫驿站 1万+

三切分快速排序

三切分快速排序 在普通的快速排序中,如果存在一组待排序的子数组全部为重复的元素,我们还对其进行划分排序,这样性能会下降,那么,如何改进存在大量重复元素的数组排序的性能呢?E.W.Dijkstra这个算法界无处不在的大佬提出了荷兰国旗问题,引出了三项切分快速排序的方法。这种方法与普通快排所区分的地方在于划分时不是划分成不大于和不小于两部分,而是划分成小于,等于,大于三部分,这样重复的值就可以不用再...

CSMrZ的博客 1908

快速排序+改进版(邓俊辉老师讲授)

课程链接地址:https://www.bilibili.com/video/av22774520 快速排序是另一个分而治之排序算法。归并排序的重点在于合并,快速排序的重点在于分。(红色为每一次选取的候选轴点) 对于一个数组,起始为lo,结束为hi,轴点为pivot。通过每次选取不同的轴点,将轴点移动至某一位置,使得满足下述条件。 那么如何分呢?重点在于寻找轴点轴点需要满足的条件:其左侧元...

锅巴 1722
上一篇: 了解一下:比JDK最高快170倍,高性能多语言序列化框架Fury中,用到的Janino编译器
下一篇: Go有协程,Java有虚拟线程,聊一聊Java Virtual Threads
Walter Sun
博客等级 码龄9年 1726粉丝 288原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Walter Sun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值