算法笔记-快速排序(Quick Sort)

算法学习 (门徒计划)3-1 快速排序(Quick-Sort)及优化及经典问题 学习笔记 简要描述快速排序的模型,并分析快排的优缺点,来了解如何优化快排,再实际操作优化快排,最后以一些算法题目进行复习。 阅读详情

看了教科书上的快排,又对比了“Algorithm 4th”里的快排,感觉后者更加简洁清晰,而且成功cover极端情况,故决定采用“Algorithm 4th”里面的快排代码。
算法思路:
一轮 QuickSort Partition有两个phase:
phase 1:重复步骤直到i, j指针交叉

  • 从左向右扫描i指针(只要满足a[i]<a[lo],当然,一开始把a[lo]作为pivot了)
  • 从右向左扫描j指针(只要满足a[j]>a[lo])

phase 2: 当i, j交叉时

  • 交换a[lo]和a[j](注意!不是交换a[i]!因为此时a[j]能保证是小于等于a[lo]的。)

以上一轮过程就是partition。

Language: Java
Partition过程:(一轮归位)

private static int partition(Comparable[] a, int lo, int hi)
{
    int i = lo, j = hi+1;//之所以是hi+1是因为下面是--j,j要先减1然后再对比
    while(true)
    {
        while(less(a[++i], a[lo]))
            if(i == hi) break;
        while(less(a[lo], a[--j]))
            if(j == lo) break;

        if(i >= j)break;检测i,j是否交叉
        swap(a[i], a[j]);//如果i,j尚未相遇,则交换
}

swap(a[lo], a[j])//注意是和a[j]不是a[i]交换!
return j;//返回被正确归位的元素位置
}

QuickSort完整过程:

public class Quick
{
    private static int partition(Comparable[] a, int lo, int hi)
    {/*见上面代码*/}

    public static void sort(Comparable[] a)
    {
        StdRandom.shuffle(a);//Shuffle是很重要的
        sort(a,0,a.length-1);//正式开始排序
}

    private static void sort(Comparable[] a, int lo, int hi)
    {
        if(hi <= lo) return;
        int j = partition(a,lo,hi);//j是已归位位置
        sort(a,lo,j-1);
        sort(a,j+1,hi);
}
}

QuickSort 细节:

  • QuickSort比MergeSort的优点在于快排的partition是in-place的,不会占用多余空间。
  • 判断指针是否交叉是很关键的一个环节
  • 越界判断:i==hi是必须的,j==lo是redundant的。
  • Shuffling is needed for performance guarantee.
  • Equal Keys. 当有待排序数列中有重复元素时,在和pivot相同的元素位置上停下来会更好。(尽管counter-intuitive,见下一节笔记。)
  • Best case: O(NlogN)O(NlogN),有点像二分法;Worst case: O(N2)O(N2)

不仅快排是面试常考算法,其中的Partition也是Leetcode常用代码。

快速排序(Quick sort) 一、简介 快速排序是(Quick sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。 二、算法思路 快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据比另一部分都要小,然后继续递归排序这两部分,最终实现所有数据有序。 大致步骤如下: 首先设置一个分界值也就是基准值又是也称为监视哨,通过该分界值将数据分割成两部分。 将大于或等于分界值的数据集中到右边,小于分界值的数据集中到左边。一趟排序过后,左边部 阅读详情

相关推荐

C++实现经典的“快速排序(Quick Sort)”算法

快速排序是一种基于分治法的排序算法。它的基本思想是通过一个“基准元素”(pivot)将待排序数组分成两个子数组,其中一个子数组的元素全部小于基准元素,另一个子数组的元素全部大于基准元素,然后递归地对两个子数组进行排序。

程序猿老樊的博客 1103

图解快排——快速排序算法(quick sort)

快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。

仅以此博客记录日常学习工作中所思所得,水平有限,难登大雅,万望海涵。 4万+

算法笔记.胡凡(完整版)

该资源为胡凡主编的算法笔记完整版pdf文档,资源真实有效请放心下载。

排序——快速排序(Quick sort)

概况 快速排序(Quick sort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1960年提出。 算法思路 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: ......

努力中的老周的专栏 32万+

.archivetemp算法笔记.胡凡(详细书签).pdf

用于研究生入学考试复试机试以及PAT等各种上机考试,由浙大研究生编写,适合基础较差的同学入门学习C语言及数据机构与算法的核心内容,童叟无欺

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6559

算法 - 快速排序(Quick_sort)

快速排序(Quick_sort)的特点就是:序列越乱越快,越有序越慢。最优情况:O(nlogn)每趟排序数据元素都能被平均分配成两个部分,形成一个完美的二叉树。最坏情况:O()也就是原序列相对最有序的情况,形成的树只有左子树和右子树,比较次数为:(n - 1) + (n - 2) + (n - 3)+……+ 1 = n * (n - 1)/2空间复杂度:O(1)..................

曾铎的博客 9589

初识Classic AUTOSAR开发工具链

在过去,软件和硬件之间具有很强的耦合性,阻碍了软件组件在不同硬件平台上的可移植性和重用性。而AUTOSAR作为汽车电子行业的标准,提供标准的软件接口定义,工程师可以根据需求将软件组件分配到汽车的ECU中,实现标准软件组件的可重用性。

怿星科技的博客 8092

算法笔记-胡凡-两本完整PDF

算法笔记-胡凡-两本完整PDF

Eli_Code 1万+

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

多边形裁剪算法

多边形裁剪算法 刚参加工作就跟多边形刚上了,对于多边形的裁剪做一些简单的总结。 多边形裁剪主要有四种算法 Greiner-Hormann裁剪算法 Sutherland-Hodgman算法 Vatti裁剪算法 Weiler-Atherton裁剪算法 作为一名想要成为优秀算法工程师的程序员,我们不能只会使用,而不知道其原理,倘若如此,我们无法做到应用于本身业务上的定制化的修改。 Greiner–H...

papalqi 6728

算法笔记:快速排序(Quick Sort)

一. 快排的基本思路 1. 给数组洗牌。(为什么要先让数组随机排列后续会讲) 2. 选择一个元素a[j]。如果数组是要从小到大排序,那么我们把所有小于a[j]的元素放到a[j]左侧,把所有大于a[j]的元素放到a[j]的右侧。 3. 对a[j]的左侧和右侧分别排序。 二. 具体实现 1. 如何实现上述第二项中的要求? Repeat until i and j pointers cros...

彩虹糖的博客 1026

【汽车ECU标定技术解析】DCM文件与A2L、HEX的协同工作机制

本文深入解析了汽车ECU标定中DCM、A2L与HEX三大核心文件的协同工作机制。A2L文件作为定义标定变量地址与规则的“图纸”,DCM文件承载工程师调试后的具体标定数据,最终通过A2L的地址映射,将DCM数据固化生成可刷入ECU的HEX文件,形成完整的标定数据流转闭环。

weixin_29214559的博客 436

算法笔记-快速排序(Quick Sort)之Selection

Quick-Selection问题描述: Goal: 给了一个有N个元素的数组,找出最大的第K个元素。(或返回最大or最小的K个) Ex: Min(k = 0), Max(k = N-1), Medium(k = N/2) 思路: 给数组Partition(如果是返回最大or最小的K个元素不一定要排序,因为没要求返回排好序的K个数,但Partition用的是Quick Sort的),找到第...

Peggy_Chang的博客 294

Workbench-nCode下发动机引擎应力疲劳分析

在工程数据库中定义材料模型参数,结构场分析基本参数:密度7850Kg/m3、弹性模量210E9Pa、泊松比0.3,疲劳分析参数:应力-疲劳曲线表(S-N Curve),应力-疲劳曲线如下图2所示,如果没有合适的数据可使用结构钢材料进行分析。网格为四面体高阶单元,各零件的单元尺寸如下表1所示,单元质量分布如下图3所示。在workbench平台下搭建分析流程如下图6所示,前述设定完成后,提交求解后即可得到相应的应力、应变结果,更新结果后目录树中会有相应的nCode DesignLife插件,如下图7所示。

ansysxuexizhe的博客 1547

基于opencv人脸识别实现课堂抬头率检测系统 完整代码 可直接运行 作为毕设

基于opencv人脸识别实现课堂抬头率检测系统 完整代码 可直接运行 作为毕设

机器学习深度学习业余选手 1146

【C++算法笔记-02】快速排序算法(quick sort)

#include<iostream> #include<cstdio> #include<cmath> #define pi 3.14 typedef long long LL; using namespace std; int Partition(int a[],int l,int r){ int temp=a[l]; while(l<r){ while(l<r&&a[r]>temp) r--; .

FENG_LIN的博客 1051

东北大学计算机预推免(双非友好)

东北大学,个人觉得在985里面对双非比较友好,而且学校的计算机专业实力也比较强,上岸难度不算很大,可以重点关注一下。学校复试审核的时间比较早,拿到复试资格之后,一定要留意报名系统首页中计算机学院的信息,学校也会在全国各地不同时间安排面试,可以根据自己的情况选择一个合适的时间前去面试,并且有对应面试场次的QQ群,信息会在群里面发布。面试成绩会在预推免系统中直接公布,但是是否拟录取不会公布,需要考生自行判断,今年计算机学院录取线定在了86分左右,最终递补下来,好像录取到了84分左右。

D1379951481的博客 3120

算法笔记-快速排序(Quick Sort)之Duplicate Keys

问题描述: 当数组中有很多重复的元素(Dupicate Keys)时,采用3-way partitioning,即把array分成三部分,一部分是小于duplicate keys的,一部分是等于duplicate keys,还有一部分是大于duplicate keys。当然,一轮partition只能让一种duplicate keys归位,如果其他数字也有duplicate的情况,则需要进行下一...

Peggy_Chang的博客 781

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【算法笔记】深入浅出快速排序(Quick Sort)及C++实现

本文介绍了快速排序算法及其实现。快速排序采用分治法,通过选取基准值将数组分为两部分递归排序。平均时间复杂度为O(nlogn),最坏情况下为O(n²),空间复杂度O(logn)。文章详细解析了基于"挖坑法"的C++实现代码,包括分割函数和递归处理流程。针对算法优化提出了三数取中法、随机基准数、小区间切换排序和三路快排等策略。快速排序凭借其优秀的平均性能和原地排序特性,成为工业界广泛应用的高效排序算法,是理解分治思想的经典案例。

2301_79977024的博客 462

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

快速排序quick_sort & 归并排序merge_sort【算法模板笔记】

【代码】排序sort【算法模板笔记】

weixin_49320014的博客 340

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【 python 学习笔记 -- 数据结构与算法 】快速排序 Quick Sort

【快速排序】:   利用递归算法, 首先选择一个基准值(pivot value),这里我们选列表的第一个值作为例。这个基准值的作用是协助列表的分割。   这个基准值在正序列表中的正确位置,我们称之为分割点(split point)。这个点用于将列表分成两个部分,然后再对每个部分做快速排序。   分割过程如下:   首先我们选择列表首个元素作为基准值,这个例子中即为54      接下来...

weixin_34315189的博客 96

【算法笔记--快速排序算法】

Quick Sort (快速排序) GeesforGeeks Quick Sort博文,包括视频、算法复杂度分析,C C++ Java Python C#的实现版本 单词 pivote 中心点 partition 分开、划分、分隔 Divide and Conquer algorithm 分治算法 例如:Quick Sort, Merge Sort array中选一个元素作为 pivot 将p...

zhjali123的专栏 294

快速排序(Quick Sort)

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 算法描述 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 从数列中挑出一个元素,称为 “基准”(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆...

ThinkWon的博客 1万+

深入解析:JavaScript快速排序(Quick Sort)算法实现

排序算法根据其时间复杂度和空间复杂度可以分为多种类型。常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。其中,快速排序因其平均时间复杂度为O(n log n),且在实际应用中表现出色,被认为是目前排序效率较高的算法之一。

ccc1006的博客 930

python算法 之 快速排序(Quick Sort)

快速排序(Quick Sort)是一种基于分治思想的排序算法,是目前使用最广泛的排序算法之一。其基本思想是选取一个基准元素,然后将数组分成小于等于基准的子数组和大于基准的子数组,再递归地对这两个子数组进行快速排序,最后将它们合并起来即可。划分操作采用两种方式:Lomuto 分割和 Hoare 分割。

风华浪浪的博客 6332
上一篇: [Leetcode] 771. Jewels and Stones
下一篇: 算法笔记-快速排序(Quick Sort)之Selection
Peggy_Chang
博客等级 码龄11年 21粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值