「一发入魂」一文切底搞懂快速排序算法

优快云豪华盲盒, 一发入魂直接获得iPhone13, 请叫我欧皇 ! 前言???? 先发一个表情, 表示一下自己此时此刻的心情~ 肯定有人,觉得你肯定是托什么的, 哈哈哈哈哈, 但是不好意思,这是真的~ 中奖的正确姿势???? 原本的只是想要开一年的 csdn会员, 想着这个盲盒, 298 无论是开的什么内容都觉得不亏. 并且当时还安利了自己的同事 起初也没有想过会直接中奖 iPhone13 , 结果一发入魂!!! 不多说了好吧, 我直接好家伙, 我直接感谢优快云官方, 对于还在犹豫的小伙伴, 建议直接大胆往前冲, 毕竟优快云保底会员, 对于自己之后学习一些 阅读详情

目录

快速排序核心思想

快速排序图文示例

快速排序代码实现

快速排序复杂度

快速排序核心思想

  • 1)选取一个基准元素(pivot),一般选择第一个元素或者最后一个元素。
  • 2)从数列的左右两端开始向中间扫描,设两个指针left和right,其中left指向数列的左端,right指向数列的右端。
  • 3)比较基准元素和left所指向的元素,如果left所指向的元素小于基准元素,则left右移一位;否则停止移动。
  • 4)比较基准元素和right所指向的元素,如果right所指向的元素大于基准元素,则j左移一位;否则停止移动。
  • 5)如果left和right都停止移动,则交换left和right所指向的元素。
  • 6)重复步骤3到步骤5,直到left和right相遇。
  • 7)将基准元素与left所指向的元素交换。
  • 8)递归地对左右两个子序列进行快速排序。

注意事项:

  • 1)如果选取数列的第一个元素为基准元素,则从right所指向的元素开始与基准元素进行比较;如果选取数列的最后一个元素为基准元素,则从left所指向的元素开始与基准元素进行比较。
  • 2)如果选取数列的第一个元素为基准元素,left所指向的元素与基准元素第一次对比时,left下标与基准元素下标相等(即:判断条件中添加等号);如果选取数列的最后一个元素为基准元素,right所指向的元素与基准元素第一次对比时,right下标与基准元素下标相等。

快速排序图文示例

将一个无序数列3、7、8、1、5、2、6、4按从小到大的顺序进行排序。按照快速排序的思想,先选取一个基准元素,以数列的第一个元素3为例。

如图所示:

1)选取数列的第一个元素3为基准元素,从数列的右指针开始,比较右指针指向的元素4与基准元素3,4>3,因此右指针向左移动一位。

2)比较右指针指向的元素6与基准元素3,6>3,因此右指针继续向左移动一位。

3)比较右指针指向的元素2与基准元素3,2<3,右指针停止移动;比较左指针指向的元素3与基准元素3,3=3,因此左指针向右移动一位。

4)比较左指针指向的元素7与基准元素3,7>3,左指针停止移动,交换左右指针指向的元素(即:元素7与元素2交换位置)。

5)比较右指针指向的元素7与基准元素3,7>3,因此右指针向左移动一位,以此类推,直到左右指针重合。

6)注意:左右指针在元素1处重合,期间元素1和元素8通过对比基准元素交换了位置。此时,交换基准元素3与左指针(右指针也可以,因为左右指针已经指向同一个位置)指向的元素1的位置,并返回基准点(即:基准元素所在下标p=2),第一轮排序结束。

此时,小于基准元素3的元素(1,2)在基准元素左边,大于基准元素3的元素(8,5,7,6,4)在基准元素右边,继续对左右两边的元素进行递归排序,最终得到完整排序后的有序数列。

其中:

  • pivot:选取的基准元素(图中为待排序数列的第一个元素)
  • p:基准元素所在下标。
  • left:待排序数列左指针。
  • right:待排序数列右指针。

快速排序代码实现

/**
 * @author 南秋同学
 * 快速排序算法
 */
public class QuickSort {

    /**
     * 快速排序
     * @param a 待排序数组
     * @param l 待排序数组left下标
     * @param r 待排序数组right下标
     */
    public static void quickSort(int[] a, int l, int r){
        // 终止条件
        if(l >= r){
           return ;
        }
        // 获取基准元素下标
        int p = partition(a, l, r);
        // 递归排序左右分区
        quickSort(a, l, p-1);
        quickSort(a, p+1, r);
    }

    /**
     * 获取每轮排序后基准点(即:基准元素在数组中的位置)
     * @param a 待排序数组
     * @param l 待排序数组left下标
     * @param r 待排序数组right下标
     * @return 每轮排序后基准点
     */
    private static int partition(int[] a, int l, int r){
        // 选取基准元素,此处为数列的第一个元素
        int p = a[l];
        // 设置左右指针left和right
        int left = l;
        int right = r;
        while (left < right){
            // 比较基准元素和right所指向的元素,如果right所指向的元素大于基准元素,则j左移一位;否则停止移动。
            while (left < right && a[right] > p){
                right--;
            }
            // 比较基准元素和left所指向的元素,如果left所指向的元素小于基准元素,则left右移一位;否则停止移动。
            // 特别注意:由于选取数列的第一个元素为基准元素,判断时left所指向的元素时可以等于基准元素。
            while (left < right && a[left] <= p){
                left++;
            }
            // 交换left和right所指向的元素。
            swap(a, left, right);
        }
        // 将基准元素与left所指向的元素交换。
        swap(a,l,left);
        System.out.println(Arrays.toString(a) + " 排序后,基准元素["+p+"]在数列中的下标为:" + left);
        return left;
    }

    /**
     * 交换left和right所指向的元素
     * @param a 待排序数组
     * @param left 元素下标
     * @param right 元素下标
     */
    public static void swap(int[] a,int left,int right){
        int t=a[left];
        a[left]=a[right];
        a[right]=t;
    }

    public static void main(String[] args) {
        int[] a = {3,7,8,1,5,2,6,4};
        System.out.println("待排序数组:"+Arrays.toString(a));
        QuickSort.quickSort(a, 0, a.length-1);
    }
}

快速排序复杂度

快速排序是一种原地、不稳定的排序算法,时间复杂度一般为 O(nlogn) ,最坏退化成O(n2)(如:原来数组已经有序,快速排序的时间复杂度就退化成O(n2))。

【作者简介】

一枚热爱技术和生活的老贝比,专注于Java领域,关注【南秋同学】带你一起学习成长~

快速排序:一场算法界的“速度与激情” 快速排序 阅读详情

相关推荐

【五大常用算法】一文搞懂分治算法

原创公众号:bigsai 文章收录在 bigsai-algorithm 求个star 前言 分治算法(divide and conquer)是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算法,本篇就带你较为全面的去认识和了解分治算法。 在学习分治算法之前,问你一个问题,相信大家小时候都有存钱罐的经历,父母亲人如果给钱都会往自己的宝藏中存钱,我们每隔一段时间都会清点清点钱。但是一堆钱让你处理起来你可能觉得很复.

bigsai 3621

快速排序示例

快速排序示例

pestilens的博客 1268

算法介绍——快速排序

快速排序 快速排序是最常用的排序算法。 举例说明 假设我们要对 “6 1 2 7 9 3 4 5 10 8” 这 10 个数进行排序。 C代码实现 # 复杂度分析

程序员「阿基米东」的编程之旅 4万+

快速排序算法实例

例: 对关键码序列(66,13,51,76,81,26,57,69,23)进行快速排序。 求第一趟划分后的结果。 关键码序列递增。 以第一个元素为划分基准。 【主要方法步骤】如下: 将两个指针i,j分别指向表的起始和最后的位置。 反复操作以下两步: (1)j逐渐减小,并逐次比较j指向的元素和目标元素的大小,若p(j)<T则交换位置。 (2)i逐渐增大,并逐次比较i指向的元素和目标元素的大小,若p(i)>T则交换位置。 直到i,j指向同一个值,循环结束。 步骤一: 首先设置两个变量i,j。分别指向

qq_41475583的博客 9955

《画解数据结构》「快速排序」算法教程

时间复杂度为 nlog(n) 的排序。

英雄哪里出来 5478

一个快速排序的小例子

自己写的一个快速排序的小例子,比较易懂,初学者能够迅速领会快速排序的含义

快速排序

它的时间复杂度达到了O(N2)。假如我们的计算机每秒钟可以运行10亿次,那么对1亿个数进行排序,桶排序则只需要0.1秒,而冒泡排序则需要1千万秒,达到115天之久,是不是很吓人。那有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。         假设我们现在对“6  1  2 7  9  3  4  5 10  8”这个10个数

li10080115的专栏 615

Silvaco TCAD仿真例库——肖特基二极管正向特性(例子)

此示例演示了肖特基二极管正向特性的仿真。 展示了: 使用 Atlas 语法形成二极管结构 设置阳极的肖特基势垒高度 正向偏置阳极 代码 第一部分:描述设备 mesh(网格) electrodes locations(电极位置) doping distribution(掺杂分布) 这是位于结构左侧和右侧的,2维n型器件,具有重掺杂浮动 p 型保护环区域, (2D n-type device with heavily doped floating p-type guard ring regio.

weixin_41788560的博客 2万+

快速排序:原理、示例与 C 语言实现详解

将原问题分解为若干个规模更小但结构相似的子问题,递归地解决这些子问题,最后合并子问题的解得到原问题的解。:在待排序序列中选择一个元素作为基准值(pivot),将序列划分为两部分。:分别对左右两个子序列递归地应用快速排序算法,直至子序列长度为 1 或 0(自然有序)。快速排序的平均时间复杂度为 O (n log n),属于不稳定排序。

xienda的博客 850

从平面到立体:一张图看懂MOSFET、FinFET到GAAFET的演变史(附结构对比图)

本文深入解析了半导体晶体管从平面MOSFET到三维FinFET,再到全环绕栅极GAAFET的技术演进历程。通过结构对比图和物理原理分析,揭示了每一次创新如何解决短沟道效应等关键挑战,推动芯片性能提升。特别关注GAAFET作为最新技术突破的架构特点和性能优势。

weixin_30892037的博客 697

STM32玩转C++:从Arduino库到HAL库的封装思路(Clion环境配置指南)

本文介绍了如何在STM32开发中使用C++封装HAL库,从Arduino风格过渡到更高效的开发方式。通过Clion环境配置指南和详细的代码示例,展示了如何利用C++的面向对象特性简化GPIO、UART等外设操作,提升代码可读性和开发效率。特别适合嵌入式开发者和从Arduino转向STM32的开发者。

weixin_33737134的博客 335

数据结构之快速排序算法(快排)【图文详解】

本文所展示内容位数据结构排序算法之快速排序,其可分类为四种排序方法,并附有快速排序的优化,图文详解

LiU11e的博客 4618

基于FastLIO2与TEB算法的机器狗自主导航系统实战

本文详细介绍了如何为机器狗构建一套基于FastLIO2与TEB算法的自主导航系统。通过整合FastLIO2激光惯性里程计实现精准定位,并采用TEB局部规划器进行灵活路径规划与动态避障,解决了传统方案在复杂地形下反应慢、易碰撞的问题。文章提供了从环境搭建、算法部署、地图转换到系统调试的完整实战指南,帮助开发者实现机器狗的稳健自主行走。

beer8的博客 321

上个厕所的功夫,就学会了“快速排序”算法

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像BAT、TMD等知名IT公司都喜欢考查快速排序原理和手写源码。 本文带你五分钟快速了解快排原理和源码。相信能帮助到你。

陈哈哈的菜园子 11万+

绿盾注册机 使用手册

在很多涉及工程设计的单位(如建筑、模具、电路、广告等),电子图纸的应用极为普遍,而电子图纸的丢失、被盗对企业利益的影响是显而易见的,如果被竞争对手获取,甚至可能造成致命的打击。因此,对于这类企业,电子图纸的保密显得至关重要。绿盾信息安全管理软件充分考虑了电子图纸的各种可能传播途径,制定了针对性的解决方案,从而保证了电子图纸的安全。 我们总结了电子图纸的各种传播途径以及相应的对策,有如下几点:

998

ComfyUI 的 LoRA 训练:素材打标签与调优全攻略

标签是 LoRA 训练的"地基"——地基打不牢,后续调参再精细也难出好效果。记住:标签要"少而精",聚焦独特点,用触发词控效果。下一篇我们将讲解参数设置,让你的优质标签发挥最大价值~

2301_78150483的博客 3099

【算法】一文看懂快速排序!!!

快速排序是一种基于分治思想的高效排序算法,核心思想是选取基准值将数组划分为两部分,比基准值小的放左边,大的放右边,然后递归处理子区间。文章详细介绍了Hoare、挖坑法和前后指针三种划分方式,并分析了Hoare版本的关键问题。针对快排的优化策略包括三数取中法选择基准值、小区间转插入排序以及三路划分等。此外还讲解了非递归实现方法,通过栈模拟递归过程。快排平均时间复杂度为O(N log N),但不稳定且极端情况下可能退化到O(N²),需要根据场景选择合适的优化方案。

suxi_na的博客 1957

路径跟踪 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

纯追踪算法(Pure Pursuit)参考了人类驾驶行为,其基本思想是在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点直至抵达目标位置.本文详细推导纯追踪算法的理论原理及其变种——自适应纯追踪算法(APP)和规范化纯追踪算法(RPP),并提供ROS C++/Python/Matlab三种仿真实现加深理解

FRIGIDWINTER的博客 8409

经典算法(4)图解快速排序算法及代码实现

很多软件公司的笔试和面试,像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。这篇博客用图解的形式对快速排序过程做了说明,并且有完整的代码实现。

扬帆向海的博客 4万+

ROS从入门到精通0-1:教程导读

ROS概念太多太复杂?ROS从入门到精通系列订阅必看

FRIGIDWINTER的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

一文搞懂快速排序

一文搞懂快速排序——单路快排、三路快排、随机基准三路快排、双基准快排、内省排序、插入排序、堆排序。 附上大量手搓gif图,易于理解。

m0_54355172的博客 1275

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

一个例子搞懂快速排序算法

一、快速排序算法 快速排序算法是对冒泡排序的一种改进。 快排基本思想是:通过一趟排序将要排序的数据以基准数据分割成独立的两部分,其中一部分的所有数据都比基准数据小,另外一部分的所有数据都比基准数据大,然后再通过递归对这两部分数据分别进行快速排序,实现整个数据变成有序序列。 二、实例排序步骤分析 样本数据:45 23 68 88 55 12 100 9 基准数: 一般取待排序序列的第一个 目标: ...

zhouxukun123的专栏 5057

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

排序算法——快速排序

快速排序是一种基于分治策略的排序算法,运行高效,应用广泛。快速排序的核心就是“哨兵划分”,其目的是:选择数组中的某个元素作为“基准数”,其左边均为小于基准数的数,其右边均为大于基准数的数。哨兵划分完成后,原数组被划分成三部分:左子数组、基准数、右子数组,且满足“左子数组任意元素 ≤ 基准数 ≤ 右子数组任意元素”。因此,我们接下来只需对这两个子数组进行排序。之后进行了两次复杂度优化,一次是对基准数的选取,优化时间复杂度,一次是对递归数组的选取,优化空间复杂度。

2202_75359757的博客 4733

五大常用算法:一文搞懂分治算法

/中间的最大值 if(max<leftmax) max=leftmax;快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面,然后递归分治求解两个子区间,当然快排因为在分的时候就做了很多工作,当全部分到最底层的时候这个序列的值就是排序完的值。最大子序列和的问题我们可以使用动态规划的解法,但是也可以使用分治算法来解决问题,但是最大子序列和在合并的时候并不是简单的合并,因为子序列和涉及到一个长度的问题,所以正确结果不一定全在最左侧或者最右侧,而可能出现结果的区域为:。

2501_93235152的博客 780

快速排序算法原理

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

Mr_xiayijie的博客 1万+

分治算法之快速排序

分治算法由两部分组成: 分:递归解决较小的问题(基本情况除外)。 治:然后从子问题的解构建原问题的解。 传统上,在正文中至少含有两个递归调用的例程叫作分治算法,而正文中只含有一个递归调用的例程不是分治算法。一般坚持子问题是不相交的(即基本不重叠)。 分治算法的经典例子有归并排序和快速排序,它们分别有O(N logN)的最坏情形以及平均情形的时间界。 所有有效的分治算法都是把问题分成一些子

一个小白的成长之路 1万+
上一篇: Kafka核心原理之精准一次性投递
下一篇: 「一发入魂」Redis哨兵机制
南秋同学
博客等级 码龄7年 64粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值