快速排序算法

JavaScript实现快速排序算法 JavaScript实现经典排序算法—快排 快速排序算法的性能比之前的冒泡、选择排序都要好,和归并排序一样,是一个可以用于实战的算法,听说chrome用的就是快排 又听说前端面试会考,那你实现一个快排吧! 一、快速排序的算法思路 还是在这里看一下快排是啥意思 快速排序算法动图 1、快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边 2、再设置一个基准线,再这样小的放左边,大的放右边,递归。 二、编码实现 详细分析 阅读详情

快速排序

在了解快速排序前,我们先通过了解一个问题:如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6WxhrgA-1686740233028)(E:\zy-o\Vue\image-20221122163432880.png)]

荷兰国旗问题一

我们首先来实现荷兰国旗的问题一:

原数组数据为:3 5 6 7 4 3 5 8

使用图解,我们来解决荷兰国旗问题:如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRyfT0BO-1686740233030)(E:\zy-o\Vue\image-20221122165947304.png)]

核心算法:

 // partition 分层
    // arr[L...R]部分进行分层操作,也就是划分操作
    public static void partition(int[] arr,int L,int R){
        // 假定按照整个数据的最后一个数据值以依据来划分,记作p 则 p = arr[R];
        // 定义<=p 区域的边界
        int less = L - 1; //小于区域的边界一开始是整个数据的左侧,因此是L - 1;

        // 开始操作:
//        因此具体实现算法分为了两个过程:
//        1) 如果arr[i] <= 5,我们要将它放到红色区域中,也就是<=5的区域中
//        具体操作为: 使arr[i] 与 红色区域后的下一个元素进行互换,然后红色区域右扩1,i++;
//        2) 如果arr[i] > 5,那么无需移动,i++
        // L所在的左边,就是指针开始位置,也就是上述i的含义
        while (L < R){ //如果L 一直向右移动,直到整个数据的右边界后就表名已经排好序了.
            if (arr[L] <= 5){
                // 交换arr[L] 和 红色区域的下一个元素,然后L++
                // 红色区域右扩
                swap(arr,L++,++less);
//                System.out.println(Arrays.toString(arr));
            }
            if(arr[L] > 5){
                // 原地不动,L++
                L++;
//                System.out.println(Arrays.toString(arr));
            }
        }
        // 至此,partition算法完成
    }

swap算法

// 交换数组中的两个数
public static void swap(int []arr, int i,int j){
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

荷兰国旗问题二

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jctOJBAC-1686740233030)(E:\zy-o\Vue\image-20221122172034155.png)]

我们首先来实现荷兰国旗的问题二:

原数组数据为:3 5 6 7 4 3 5 8

使用图解,我们来解决荷兰国旗问题二:如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1KKIejN-1686740233030)(E:\zy-o\Vue\image-20221122183518211.png)]

核心算法:

 // partition 分层
    // arr[L...R]部分进行分层操作,也就是划分操作
    public static void partition(int[] arr,int L,int R){
        // 假定按照整个数据的最后一个数据值以依据来划分,记作p 则 p = arr[R];
        // 定义<=p 区域的边界
        int less = L - 1; //小于区域的边界一开始是整个数据的左侧,因此是L - 1;
        int more = R + 1; //大于区域的边界一开始是整个数据的右侧,因此是R + 1。
        int p = arr[R]; //因为在变化过程中,arr[R]是会发生变化的,因此需要先记录下来
        // 开始操作:
//        因此具体实现算法分为了三个过程:
//        1) 如果arr[i] < 5,我们要将它放到红色区域中,也就是<5的区域中
//        具体操作为: 使arr[i] 与 红色区域后的下一个元素进行互换,然后红色区域右扩1,i++;
//        2) 如果arr[i] > 5,我们要将它放到蓝色区域中,也就是>5的区域中
//        具体操作为: 使arr[i] 与 蓝色区域前的前一个元素进行互换,然后蓝色区域左扩1,i不变;
//        因为 互换过来的数据我们不知道其大小,因此i不能变,应该继续判断
//        3)如果arr[i] == 5,无需移动,直接让i++即可
//        实质就是 < 区域推动着==区域,当与>区域撞上时,就表示分配完成了
//        那就是L 与 more撞上的时候,就表示分配完成了
        // L所在的左边,就是指针开始位置,也就是上述i的含义
        while (L < more){ //如果L 一直向右移动,直到整个数据的右边界后就表名已经排好序了.
            if (arr[L] < p){
                // 交换arr[L] 和 红色区域的下一个元素,然后L++
                // 红色区域右扩
                swap(arr,L++,++less);
//                System.out.println(Arrays.toString(arr));
            }else if(arr[L] > p) {
                swap(arr, L, --more);
            }else {
//                如果相等原地不动,指针后移
                L++;
            }
        }
        // 至此,partition算法完成
    }

swap算法:

// 交换数组中的两个数
public static void swap(int []arr, int i,int j){
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

完成了上述荷兰问题的解析后,接下来我们就可以引出快速排序了。

快排v1.0

首先先来说一下快排v1.0版本,基于荷兰问题的想法,再加上排序,怎么排序呢?

快排v1.0是基于荷兰国旗问题一得思想来排序的。

具体过程如下:使用图解的形式给出

原数组数据为:3 5 6 7 4 3 5 5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KnTLWyaf-1686740233031)(E:\zy-o\Vue\image-20221122210710344.png)]

快排v2.0

再来说一下快排v2.0版本,基于荷兰问题的想法,再加上排序,怎么排序呢?

快排v2.0是基于荷兰国旗问题一得思想来排序的。

具体过程如下:使用图解的形式给出

原数组数据为:3 5 6 7 4 3 5 5

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-28TnnbXg-1686740233031)(E:\zy-o\Vue\image-20221122213316682.png)]

快排v3.0

上面讲述了快排v1.0和快排v2.0

但是这两种快速排序的时间复杂度为O(n^2) ,因为这两种快速排序每次都是选取最后一个位置的元素作为基准,来进行partition(分层)

不可避免的会遇上最坏情况的数据。

于是快排v3.0就来改进这种情况,快排v3.0主要解决的是不总是选取最后一个位置的元素的值作为基准。来进行partition

具体操作为: 随机选取数据中的一个元素,使其与最后一个位置的元素进行交换.

然后再以新的最后一个位置的元素为基准,来进行partition

具体图解如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zqN1U7IT-1686740233031)(E:\zy-o\Vue\image-20221122214156503.png)]

核心算法:

public static void quicksort(int[] arr,int L,int R){
    if (arr == null || arr.length < 2) return;
    process(arr,0,arr.length - 1);
}

public static void process(int[] arr,int L,int R){

   if (L < R){
       //随机获取元素
       int p = L + (int)(Math.random() * (R - L + 1));
       // 交换元素
       swap(arr,p,R);
       //进行partition
       int []pos = partition(arr,L,R);
       System.out.println(Arrays.toString(pos));
       // 获取左右边界的位置后,再将其根据左右边界,划分成两个独立的部分,再次进行递归排序
       // 不包括左右边界,因此pos[0] - 1 和 pos[1] + 1 
       process(arr,L,pos[0] - 1);
       process(arr,pos[1] + 1,R);
   }

}

public static int[] partition(int []arr, int L,int R){
    // 记录小于区域左边界
    int less = L - 1;
    // 记录大于区域右边界
    //因为有哨兵占用了位置,我们不对哨兵进行操作,因此右边界为R,若没有哨兵,那么应为R + 1
    int more = R;
    // L 表示指向当前元素的指针
    while (L < more){
        if (arr[L] < arr[R]){
            // 如果元素 < 基准值,那么放在小于区域的下一个元素,小于区域+1,指针后移
            swap(arr,L++,++less);
        }else if(arr[L] > arr[R]){
            // 如果元素 > 基准值,那么放在大于区域的前一个元素,大于区域+1,指针不变
            swap(arr,L,--more);
        }else {
            // 如果两者相等,那么无需移动,指针直接++
            L++;
        }
    }
    //碰撞后,四部分已经形成,那么现在只需要将哨兵位置的元素与>区域的第一个元素进行交换即可
    //大于区域进行右减1,因此是more++,因为是索引
    swap(arr,R,more);
    // 返回数组,只有两个元素,分别标记小于区域的左边界,以及大于区域的右边界
    // 记得返回的less 需要 +1 ,因为less记录的是当前小于区域的左边界位置,而需要返回的是
    // == 区域的左边界和右边界,所以需要less + 1
    return new int[]{less + 1,more};
}

swap算法:

public static void swap(int[] arr,int i,int j){
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
评分卡建模学习(一)————数据预处理part.3 目录六、数据处理的思路及代码(一)对缺失值的处理:在我这个数据预处理的part.1板块(二)对异常值的处理:在我这个数据预处理的part.2板块(三)数据归一化、标准化:在我这个数据预处理的part.2板块(四)非结构化数据转变+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++———————————————————————————————————————————++++++++++++++++++++++++++ 阅读详情

相关推荐

LK32T102 单片机 操作GPIO实现流水灯(1)

前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。...

qq_58676187的博客 3189

算法64-荷兰国旗问题

算法

weixin_41479678的博客 790

别再死记硬背了!用LTspice和Simulink仿真,5分钟搞懂巴特沃斯、切比雪夫、贝塞尔滤波器的区别

本文通过LTspice和Simulink仿真工具,直观对比了巴特沃斯、切比雪夫和贝塞尔滤波器的特性差异。从通带波纹、过渡带陡峭度到相位线性度,详细解析了三种经典滤波器的设计哲学与应用场景,帮助工程师和学生快速掌握滤波器选型技巧,提升电路设计效率。

weixin_33910191的博客 523

算法系列--荷兰国旗问题

转载 :https://yq.aliyun.com/articles/3604【问题】现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。【分析】这个问题我们可以将这个问题视为一个数组排序问题。红白蓝分别对应数字0、1、2。红、白、蓝三色小球数量并不一

大圣编了个程 966

LabVIEW通过ActiveX控件实现与三菱FX5U PLC的高效数据交互

本文详细介绍了如何利用LabVIEW的ActiveX控件,通过三菱官方MX Component工具包实现与FX5U PLC的高效数据交互。文章从环境配置、控件插入到实战代码解析,系统讲解了连接建立、数据读写及资源释放的全流程,并提供了关键的避坑指南,帮助工程师快速构建稳定可靠的上位机通讯系统。

weixin_29197051的博客 373

51单片机自学笔记(六)数码管动态扫描与消影实战

本文详细解析了51单片机数码管动态扫描原理与视觉暂留效应,通过硬件电路分析和C语言代码实战,重点介绍了三种数码管消影技术(段选清零法、位选屏蔽法、硬件消影法),解决了显示重影问题,并提供了常见问题调试技巧与定时器中断优化方案,帮助开发者掌握稳定的多位数码管显示技术。

y9z0a1b的博客 1103

荷兰国旗问题以及快速排序

  戳蓝字关注我们哦!!! 大家好,我是周一。最近几篇算法,我们都是聊的归并排序,归并排序也说的差不多了,今天讲讲快速排序。 荷兰国旗问题  1、啥是荷兰国旗问题荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但不仅仅只有这一种情况:需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。

Java和算法学习的博客 6837

达梦数据库(DM)的备份与恢复功能

本文系统介绍了达梦数据库(DM)的备份与恢复功能,主要包括作业系统和物理/逻辑备份还原两大模块。作业系统部分详细说明了通过代理环境创建定时备份和删除备份作业的步骤;物理备份还原部分阐述了联机和脱机备份方式,包括数据库、表空间、表和归档的备份还原操作;逻辑备份还原部分介绍了dexp/dimp工具的使用方法及四种级别的导入导出功能。文章还介绍了图形化管理工具进行备份还原的操作流程,全面覆盖了达梦数据库的数据保护方案,为数据库管理员提供了详细的技术指导。

weixin_48812832的博客 1210

算法:快速排序与荷兰国旗问题

文章目录荷兰国旗算法描述荷兰国旗代码展示快排算法描述快排代码展示 在聊快速排序之前,我们先解释一下荷兰国旗,即把一个数组分成三个部分,我们一般选最后一个元素作为基准值,即大于这个数的全部在左边,小于这个数的全部在右边,等于的在中间。 举个例子:arr{1,5,3,7,4,2,3,4},选取4做基准值,把他排成{1,3,2,3,4,4,7,5}大于小于区域的数顺序不要求。 荷兰国旗算法描述 首先第一步设less指针为-1,more指针为length-1。你可以想象成less是一个小于区域的右边界而more是大

m0_47268721的博客 1121

发那科机器人编程软件fanuc roboguide授权补丁_工业机器人离线编程与应用:ROBOGUIDE V8.3版本的工程文件创建...

欢迎关注我们ROBOGUIDE是发那科机器人公司提供的一个离线编程工具,可模拟现实中的机器人和周边设备的布局,通过虚拟TP示教来模拟机器人的运动轨迹,同时可以验证方案的可行性和准确的周期时间。ROBOGUIDE是一款核心应用软件,具体的还包括搬运、弧焊、喷涂等其他模块。以最新的8.3版本为例进行讲解,对于未注册的版本将有30天的免费使用期限。开始菜单击开始菜单中的HandingPRO启动程序,第一...

weixin_39791446的博客 2924

【大模型应用开发-FastAPI框架】(八)Sqlalchemy+postgresql简单增删改查

语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于。社区中成为广泛使用的ORM工具之一,不亚于Django的ORM框架。和declarative等可选插件可以让用户使用声明语法。SQLAlchemy首次发行于2006年2月,并迅速地在。SQLAlchemy“采用简单的。二、安装postgresql。一、SQLAlchemy简介。的数据映射模型,而不是其他。

2098

荷兰旗问题及随机快排和bfprt算法

1.荷兰旗问题 什么是荷兰期问题了? 荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示 假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况: 把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。 如何解决这个问题呢?我们之前在学习快排的时候我们会先选一个key出来然后通过单趟排序使得左边小于等它右边大于等于它。但是如果我们改成这样左边比它小 中间是等.

qq_56999918的博客 1386

科研绘图系列:R语言circos图(circos plot)

科研绘图系列:R语言circos图(circos plot)

专注生信领域 3431

快速排序算法原理

1.快速排序算法是什么? 想必大家都学过和用过冒泡排序吧!这应该是大家成为程序员道路上学的第一个算法哦,那么我们的快速排序算法其实是在冒泡排序的基础上的一个改进,快速排序算法是利用一趟快速排序,一趟快排一般都是取第一个数作为准基数进行排序,将一串数据分成两个部分, 第一部分都比准基数小,第二部分都比准基数大,如:(-------第一部分------准基数------第二部分),也就这样以准...

Mr_xiayijie的博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

快速排序: 使用快速排序算法对数组进行排序

快速排序: 使用快速排序算法对数组进行排序 题目 一个数组有 N 个元素,使用快速排序对其进行排序输出(本题还会人工阅卷,请使用快速排序算法进行排序) 输入描述: 输入为两行。 第一行一个整数n(1 ≤ n ≤ 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。 输出描述: 输出一行,即排序之后的数组,以空格分隔,行末无空格 示列 输入 1...

huigui65的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

快速排序算法详解

前言 什么是快速排序? 这是我之前遇到的一个面试题,当时没回答来,我只写过冒泡排序、选择排序、插入排序呀,啥是快速排序,委屈巴巴, 一首凉凉送我自己。 1. 什么是快速排序算法? 快速排序算法是对冒泡排序算法的一种改进,没有两两相邻之间的比较换位,主要采用的思想是通过递归+独立排序的形式将无序的数列进行分割成可以独立排序的2部分数列,其中一部分数列比另外一部书数列小,每次排序两个独立的数列,直到排序完毕,即可完成最终的排序, 在算法时间复杂度上比冒泡排序小很多。 ...

Dream_it_possible!的博客 4401

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

快速排序算法与舍伍德快速排序算法

排序算法是比较常见的算法,道理也比较简单,双指针法。今天被朋友问了个舍伍德排序算法,也是快速排序那种形式。尴尬,第一次听说,特意学了一下。结合快速排序,写了三个方法。 第一种: //不需要将基准值归位的快速排序 public static void quickSort(int []a,int left,int right) { if(left>=right) return ; int ...

大鹏视界U 3834

快速排序算法和Sherwood 快速排序算法

比较快速排序算法和Sherwood 快速排序算法中比较的次数 问题描述 输入数据集 { 8,18, 2,16, 6,4,40, 3,5,7,1,9 , 22 ,11,13,10,20} A.显示输出快速排序中的比较次数和Sherwood中比较的次数,及排序结果。注:第一个元素选最后一个。 B.显示奇数项(下标从0开始,)降序排列,偶数项按升序排列的排列结果。 代码实现 对于题目A:显示输出快速排序中的比较次数和Sherwood中比较的次数,及排序结果。注:第一个元素选最后一个。 代码如下: //A.显示输出

m0_51139840的博客 663

快速排序算法原理与实现

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。    假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它

起跑线的专栏 6万+

C# 快速排序算法的详细讲解

C# 快速排序算法的详细讲解

菌菌兹的博客 1796

JavaScript算法——快速排序

一、概念 快速排序算法由 C. A. R. Hoare 在 1960 年提出。它的时间复杂度也是 O(nlogn),但它在时间复杂度为 O(nlogn) 级的几种排序算法中,大多数情况下效率更高,所以快速排序的应用非常广泛。 注意: 快速排序不一定是最快的排序方法,这取决于需要排序的数据结构、数据量。不过,大多数情况下,面试官和工作场所用它的概率也是相对较高的,所以我们应该花时间把它学透彻。 二、工作原理 首先设定一个分界值,通过该分界值将数组分成左右两部分。 将大于或等于分界值的数据集中到数组右边

诸葛韩信--一个前往前端不归路的浪子 6948

快速排序算法_排序算法Java实现快速排序算法

点击上方蓝字关注我们作者:Cansluck优快云博客:https://blog.youkuaiyun.com/xgx120413开篇介绍大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java快速排序算法的实现进行分享。首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡...

weixin_39588223的博客 559

算法训练之快速排序

主要是练习算法基础当中的快速排序

qq_62904883的博客 960
上一篇: ArrayList扩容机制,通俗易懂!!!
hacknetY
博客等级 码龄7年 3粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值