双基准快速排序--Java

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战 本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。 阅读详情
/** 
    * @Date:  2020-04-13 
    * @Description: 双基准快速排序--选取 A[left], A[right] 两个数为主元 
    */ 
    public static void dualPivotQuickSort(int[] A, int left, int right) {
        if (right - left >= 1) {
            int p = minTwoNum(A[left], A[right]);
            int q = maxTwoNum(A[left], A[right]);
            int ℓ = left + 1;
            int g = right - 1;
            int k = ℓ;
            while (k <= g) {
                if (A[k] < p) {
                    A[k] = A[k] ^ A[ℓ];
                    A[ℓ] = A[k] ^ A[ℓ];
                    A[k] = A[k] ^ A[ℓ];
                    ℓ = ℓ + 1;
                } else if (A[k] >= q) {
                    while (A[g] > q && k < g) {
                        g = g - 1;
                    }
                    A[k] = A[k] ^ A[g];
                    A[g] = A[k] ^ A[g];
                    A[k] = A[k] ^ A[g];
                    g--;
                    if (A[k] < p) {
                        A[k] = A[k] ^ A[ℓ];
                        A[ℓ] = A[k] ^ A[ℓ];
                        A[k] = A[k] ^ A[ℓ];
                        ℓ = ℓ + 1;
                    }
                }
                k++;
            }
            ℓ--;
            g++;
            A[left] = A[ℓ];
            A[ℓ] = p;
            A[right] = A[g];
            A[g] = q;
            dualPivotQuickSort(A, left, ℓ - 1);
            dualPivotQuickSort(A, ℓ + 1, g - 1);
            dualPivotQuickSort(A, g + 1, right);
        }
    }

    private static int maxTwoNum(int a, int b) {
        return a > b ? a : b;
    }

    private static int minTwoNum(int a, int b) {
        return a < b ? a : b;
    }

        快速排序使子区间变得相对有序的关键是pivot,所以我们优化的方向也应该在于pivot,那就增加pivot的个数吧,而且我们可以发现,增加pivot的个数,对递归次数并不会有太大影响,有时甚至可以使递归次数减少。和insert sort类似的问题就是,pivot增加为几个呢?很显然,pivot的值也不能太大;记住,任何优化都是 有代价的 ,而增加pivot的代价就隐藏在每次 交换 元素的位置过程中,pivot越大,分的小区间越多,每次需要交换的次数就越大。

        经典快排为什么快? 所谓快其实专业的说法是“时间复杂度”。对于排序算法来说主要看的是排序所需要的元素比较的次数。

其实如果按照元素比较次数来比较的话,Dual-Pivot快排元素比较次数其实比经典快排要多。

        要理解上面的问题,先介绍点背景知识。我们平常很少考虑过CPU的速度,内存的速度,CPU和内存速度是否匹配的问题。

其实它们是不匹配的。距统计在过去的25年里面,CPU的速度平均每年增长46%, 而内存的带宽每年只增长37%,那么经过25年的这种不均衡发展,它们之间的差距已经蛮大了。假如这种不均衡持续持续发展,有一天CPU速度再增长也不会让程序变得更快,因为CPU始终在等待内存传输数据,这就是传说中内存墙(Memory Wall)。

        那么既然光比较元素比较次数这种计算排序算法复杂度的方法已经无法客观的反映算法优劣了,那么应该如何来评价一个算法呢?作者提出了一个叫做扫描元素个数的算法。

        在这种新的算法里面,我们把对于数组里面一个元素的访问: array[i] 称为一次扫描。但是对于同一个下标,并且对应的值也不变得话,即使访问多次我们也只算一次。而且我们不管这个访问到底是读还是写。其实这个所谓的扫描元素个数反应的是CPU与内存之间的数据流量的大小。因为内存比较慢,统计CPU与内存之间的数据流量的大小也就把这个比较慢的内存的因素考虑进去了,因此也就比元素比较次数更能体现算法在当下计算机里面的性能指标。


reference:https://www.jianshu.com/p/2c6f79e8ce6e

从原理到落地:监控 SAP OData bgRFC 队列的全景实践指南 摘要(150字) 本文系统讲解SAP Gateway/Backend场景中bgRFC队列的监控方法。内容涵盖:1)监控必要性——确保异步可靠传输,及时识别失败消息;2)两种服务质量(EO/EOIO)对监控策略的影响;3)通过事务码SBGRFCMON和SPRO路径访问监控界面;4)关键授权S_BGRFC的配置要求;5)详细操作指南包括筛选条件和动作选项;6)标准巡检脚本;7)三个典型案例(认证错误、顺序阻塞、调度压力)的诊断与修复方案。全文提供完整的监控方法论和实战指导。 阅读详情

相关推荐

基于EtherCAT的AM402与SV660N、IS620N伺服运动控制实战指南

本文详细介绍了基于EtherCAT总线的汇川AM402 PLC与SV660N、IS620N伺服驱动器构建运动控制系统的完整实战流程。内容涵盖硬件平台搭建、软件组态、关键参数设置、InoProShop编程及调试技巧,旨在帮助工程师快速掌握这一高精度、高响应的工业自动化解决方案。

weixin_29204205的博客 401

双支点快速排序排序法(DualPivotQuicksort)

package test; public class DualPivotQuicksort { private DualPivotQuicksort() {} private static final int MAX_RUN_COUNT = 67; private static final int MAX_RUN_LENGTH = 33; private stat...

iteye_8029的博客 369

EfficientNet中的MBConv模块详解:为什么它能如此高效?

本文深度解析了EfficientNet中的MBConv模块,详细介绍了其核心设计理念、效率优化技术和复合缩放理论。MBConv通过深度可分离卷积、倒残差结构和注意力机制三大关键技术,实现了计算效率与模型性能的平衡,成为高效网络结构设计的典范。

tcp8optimizer的博客 353

[Java]快速排序,以及双基快排

/** * 单基准快排 * 使用 quickSort(arr,0,arr.length-1) 排序整个数组 */ private static void quickSort(int[] arr, int left, int right) { //判断排序条件 if (right <= left) return; // 范围内只有两个元素时直接交换 if (right == lef

我吃西瓜很快 602

【前端】【面试】【业务场景】前端如何获取并生成设备唯一标识

问题:前端如何获取并生成设备唯一标识?核心要点:浏览器原生信息有限,但通过组合多个维度可生成设备指纹(Device Fingerprint),用于唯一标识设备。常见方式浏览器信息(User-Agent)屏幕与系统参数本地存储标识(localStorage / cookie)第三方指纹库(如 FingerprintJS)方式优点缺点手动组合指纹实现简单不稳定,识别率低持久化强容易被用户清除识别率高、稳定性好依赖第三方库IP 地址识别网络识别粗略共享网络环境下重复可能大。

qq_59344127的博客 1796

别再为跨页读写发愁了!STM32F407模拟I2C驱动24C256/512的避坑指南

本文详细解析了STM32F407模拟I2C驱动24C256/512的跨页写入问题,揭示了24C系列存储器'写满一页不会自动翻页'的关键机制,并提供了经过验证的分页写入算法和优化方案。通过GPIO时序优化、地址计算和错误处理等技巧,帮助开发者解决数据错乱、覆盖等常见问题,实现稳定可靠的EEPROM读写操作。

weixin_42631411的博客 377

学员优秀博文赏析:双基准快速排序实现

       我一般是不会去主动碰算法问题的。上学的时候一个算法复杂度就把我搞烦了,还想让我去搞算法本身?我是这么安慰自己的:反正写CRUD又不需要算法,这辈子都不需要算法的。好吧,其实我是一直不肯承认,不去动算法的原因只有三个字:因为笨!        所以你去看,一般招算法工程师的都是大厂,而且,薪水永远稳居程序员工资的顶端位置。流传在开发界的鄙视链中,算法工程师一直稳居金字塔顶端,俯睨众生...

weixin_33726943的博客 229

移花接木,玩转CANoe的几种扩展接口应用(五)——串口设备

近期看到粉丝朋友在CANoe自动化测试方面的关注度很大,今天就围绕这个做一个专题,总结一下以往项目上用过的几种CANoe扩展接口,分享出来希望对相关领域的网友有所帮助。本文是该专题的第五篇文章,主要讲解了串口设备的功能配置、连接方法、配置方法、调用方法,最后分析了这种扩展借口应用的特点和适用场景。

Mr.Cssust的博客 2369

Java中Array.sort双基准快速排序方法(DualPivotQuicksort)

相信大家在大学的《算法与数据结构》里面都学过快速排序(QuickSort), 知道这种排序的性能很好,JDK里面直到JDK6用的都是这种经典快排的算法。但是到了JDK7的时候JDK内置的排序算法已经由经典快排变成了Dual-Pivot排序算法。那么Dual-Pivot到底是何方圣神,能比我们学过的经典快排还要快呢?我们一起来看看。 经典快排 在学习新的快排之前,我们首先来复习一下经典快排,它的核心...

weixin_38507238的博客 396

第6篇:ESP32连接无源喇叭播放音乐《涛声依旧》

相邻两个音之间的倍数是2^(1/12),约等于1.0594630943592952645618252949463)。这样一来,高八度的do频率是低八度do的两倍。我们把频率440赫兹作为中央C ,C调的歌就是把频率440赫兹当作do,乐谱中写作:1=C。一个八度分成12份,八个八度的十二平均音率对应的频率如下(从33Hz到7902Hz)。相邻的两个音之间的差一个半音,12345671之间的间隔分别是“全全半全全全半”。D调的歌就是把从440后面第二个音494赫兹当作do,乐谱中写作1=D。

Txwtech 1424

SAP FI 会计科目表(COA)可直接套用配置模板

摘要:本文提供了SAP S/4HANA环境下可直接套用的会计科目表(COA)配置模板,包含科目编码规则、号段规划、科目组设置等核心内容。模板采用10位数字编码,按资产(1000)、负债(2000)、权益(3000)、成本(4000)、收入(5000)、费用(6000)六大类划分号段,并预设科目组控制字段状态。适用于集团/单一公司、国内/跨国企业场景,支持多表架构映射,配置完成后可通过事务码SAKO验证科目清单。模板遵循"前4位固定一级科目"原则,企业可根据行业特性调整明细科目。

金牌架构师 267

DualPivotQuicksort双基准快排

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、什么是DualPivotQuicksort ?二、参数2.TimSort总结 前言 DualPivotQuicksort 源码分析 一、什么是DualPivotQuicksort ? 双基准快排。 二、参数 /** * Prevents instantiation. */ private DualPivotQuicksort() {} /* * Tuning param

weixin_38730709的博客 557

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2440

Java双基准快速排序算法java.util.DualPivotQuicksort源码阅读

Java双基准快速排序算法源码阅读 jdk版本:jdk1.8.0_191 Java数组和List对象的排序方法分别是Arrays.sort(T[] a)和Collections.sort(List<T> list),分别位于java.util.Arrays和java.util.Collections类中. 由于List底层采用数组实现,因此Collections.sort方法也是通过调...

da_kao_la的博客 893

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java中quicksort的参数_Java中双基准快速排序方法(DualPivotQuicksort.sort())的具体实现...

在Java语言的Arrays类下提供了一系列排序(sort)方法,帮助使用者对各种不同数据类型的数组进行排序. 在1.7之后的版本中, Arrays.sort()方法在操作过程中实际调用的是DualPivotQuicksort类下的sort方法,DualPivotQuicksort和Arrays一样,都在java.util包下,按字面翻译过来,就是双(Dual)基准(Pivot)快速排序(Quic...

weixin_42297665的博客 317

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java数组比6大放在6前面_Java中双基准快速排序方法(DualPivotQuicksort.sort())的具体实现...

在Java语言的Arrays类下提供了一系列排序(sort)方法,帮助使用者对各种不同数据类型的数组进行排序. 在1.7之后的版本中, Arrays.sort()方法在操作过程中实际调用的是DualPivotQuicksort类下的sort方法,DualPivotQuicksort和Arrays一样,都在java.util包下,按字面翻译过来,就是双(Dual)基准(Pivot)快速排序(Quic...

weixin_36074271的博客 139

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java快速排序

基本思想: 选择一个基准元素,然后两个游标,一首一尾,然后逐个比较,经过一轮比较后,一部分比基准小,另一部分比基准大,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。 按从小到大排:当首游标位置的元素比基准小则把起始游标向前后一位start++,当尾游标比基准大时则把尾游标向前移end--;如果不符合则互换,我这里是每找到一个不 符合的就赋值一次,等最后在把基准

Zzz助 351

双枢轴快速排序与 Arrays.sort()

时间复杂度差距 当数据量大起来的时候可以看到n*log(n)以及n2,n3,2^n的时间复杂度图像都已经快成竖线了。所以在大数据面前你还在写两个for的n平方时间复杂度的暴力解法算法吗? Arrays.sort() 因为后面的双指针算法可能要先对数据排序,所以我们来研究下这里面有什么新鲜玩意。 第一层 /** * 将指定的数组按数字升序排序。 * * 实现说明:排序算法是 Vladimir Yaroslavskiy、Jon Bentley 和 * Joshua Bloch 的双枢轴快速排序。 该

RawChen · Blog 752

快速排序的两种实现(java)

用递归方式去做,这个比较明确,下面针对具体的方法分两种情况 (1)第一种   做两个游标,找!从前面找到比标准值大的数,从后面找到比标准值小的数,然后交换位置。以此重复。。。 具体步骤: 1,定义i=0,j=A.lenght-1,i为第一个数的下标,j为最后一个数下标 2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj; 3,从数组的第一个数Ai 从左往右找...

强子的博客 921

几种快速排序的几点疑问

大学学的快速排序,现在已经忘了,重新学一遍. 最近学习了一篇快速排序的文章: http://www.importnew.com/8445.html#comment-13445 发现里面双基准排序有点问题.修正如下: package test; import java.util.Arrays; public class QuickSortDualPivot extends QuickSo

haoyyy的专栏 1789

如何使用快速排序算法对整数数组进行就地排序?

快速排序算法是最常用的排序算法之一,尤其是对大型列表进行排序时,大多数编程语言、库都以一种或另一种方式实现了它。在 Java 中,Arrays.sort()方法使用由 Joshua Bloch 等人编写的双枢轴 快速排序 算法对原始数据类型进行排序。这种实现为大量数据集提供了更好的性能,传统的快速排序算法降低了二次性能。此方法还使用另一种很好的排序算法 MergeSort来对对象进行排序。C++ STL 库中也提供了快速排序实现。

ZhaFi人 1504

JAVA——快速排序(详细)

JAVA快速排序的实现 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定。 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了

youzi_qiu7的博客 2万+

java 算法之快速排序

1、快速排序是一种比较高效的排序算法,采用“分而治之”的思想,通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 2、快速排序图 3、Java 代码实现快速排序 public static void main(String[] args) { int[] arry = {9,8,7,6,5,4,3,2,1}; quickSort(arry,0, a

weixin_54951878的博客 1万+

Java 快速排序

快速排序是一种常用的基于比较的排序算法,其时间复杂度为 O(nlogn),并且具有稳定性和广泛的应用场景。本文将全面详细的讲解一下 Java 中快速排序算法的原理、实现以及时间复杂度等问题。

兴趣是最好的老师,勤能补拙 1万+

Java快速排序(固定基准元)

今天为大家介绍固定基准元的快速排序首先它是一种排序算法,排序算法是为了让无序的数据组合变成有序的数据组合。有序的数组在进行数据定位和采用时非常方便,因为有序的数据可以减少设计代码的麻烦因为无序数据进行推断前后关系时会显得很繁琐。若数据较大则采用快速排序,快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。固定基准元:即选取数组块第一个元素作为...

qq_42280372的博客 631

快速排序Java代码实现

快速排序Java代码实现 1. 快速排序原理 (1)定义一个基准元素base(我这里定义的是最左面的元素定位基准元素) (2)定义两个变量i和j,j先从右向左遍历,找到第一个比base小的数就停止,i再从左向右便利找到第一个比base大的数停止 (3)交换i和j指向的元素 (4)直到i和j指向同一个元素,将这个元素与基准元素交换 递归求解即可 2. 时间复杂度:O(nlogn) 3. 代码实现 public class Qsort { public static void main(String[] a

m0_48372408的博客 3584
上一篇: 8种日志级别
下一篇: 判断一个数为奇偶数的三种方法
wenyixicodedog
博客等级 码龄8年 87粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值