十大经典排序算法:快速排序debug分析排序过程

【菜鸟笔记|算法导论】十大排序算法总结与python实现 算法导论中提到了七种排序算法,再加上冒泡排序、选择排序、希尔排序,构成我们常说的十大排序算法。其中冒泡、选择、插入、希尔、归并、堆、快速排序都是比较排序算法(即通过对元素进行大小比较来确定顺序);计数、基数、桶排序都是非比较排序算法。十大排序算法的性能比较如下表: 下面将简单描述十大排序算法的原理,并分别用python实现。笔记自用就不附原理图了,如果对原理有疑问请参阅算法导论那本书,里面算法运行过程图解是非常清楚的。 1.冒泡排序 比较相邻两个数,若前面的数比后面的数大,则交换位置。每一轮最大的数沉底, 阅读详情

前言

★ 这里是小冷的博客
✓ 优质技术好文见专栏
个人公众号,分享一些技术上的文章,以及遇到的坑
当前系列:数据结构系列
源代码 git 仓库 ‘
数据结构代码地址 代码Git 仓库地址

快速排序

快速排序法介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两 部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排 序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

思路分析

image-20220125233740379

快速排序的思路由上图所示:

  • 首先是找到一个基准点,这个不一定非要是中位数,也可以是任意一位,可以自主分割,在什么位置都可以,这里我们以中位来学习
  • 根据中位数为基准,将需要排序的数组分为两份,之后分别交换位置,保证比中位数小的都在左边,比中位数的都在右边,此时左右两边虽然无序,但是都保证一定规则
  • 之后按照递归,再次将左边选出中位数,右边选出中位数,递归到不能交换为止

image-20220126003428506

快速排序案例

要求: 对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。【测试 8w 和 800w】 说明[验证分析]:

  1. 如果取消左右递归,结果是 -9 -567 0 23 78 70

  2. 如果取消右递归,结果是 -567 -9 0 23 78 70

  3. 如果取消左递归,结果是 -9 -567 0 23 70 78

public static void quickSort(int[] arr, int left, int right) {
        //  left index
        int l = left;
        int r = right;
        //    pivot 中轴值
        int pivot = arr[(left + right) / 2];
        //临时变量
        int temp = 0;
        //    while 循环的目的是比比中轴的pivot值小的放在左边
        //    比pivot 值大的放在右边
        while (l < r) {
            //    在pivot的左边一直寻找 找到大于等于pivot 的值才退出
            while (arr[l] < pivot) {
                l += 1;
            }
            //    在pivot的右边一直寻找 找到小于等于pivot 的值才退出
            while (arr[r] > pivot) {
                r -= 1;
            }
            //    如果 l>=r说明pivot的左右两个值已经按照左边全都是小于等于pivot,右边去哪不是大于等于pivot排列好了
            if (l >= r) {
                break;
            }
            //    交换
            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            //    如果交换玩发现这个arr[l]==pivot值 相等r--前移
            if (arr[l] == pivot) {
                r -= 1;
            }
            //如果交换玩发现 arr[r] == pivot值 相等l++ 后移
            if (arr[r] == pivot) {
                l += 1;
            }
        }
        //    如果l==r 必须是 l++ r-- 否则会出现栈溢出
        if (l == r) {
            l += 1;
            r -= 1;
        }
        //向左递归
        if (left < r) {
            quickSort(arr, left, r);
        }
        //向右递归
        if (right > l) {
            quickSort(arr, l, right);
        }
    }
排序过程断点调试

int arr[] = {-9, 78, 0, 23, -567};

我们的测试数组是一个五位数的数组,

image-20220126004245905

进入循环,此时我们看到,中位数和左右两边的索引,0和4

这里我们可以看第一组数据,

下标0 arr[l] =- 9, -9小于0于是 左边下标后移继续寻找,找到78,此时l = 1 是78对应的数组下标 此时的78 比中位 0 要大,进入右侧比对

image-20220126004606466

显然 arr[r] = -567 比中位数小,不需要改变下标,跳出循环,

此时我们对比因为我们之后需要重复的递归,这里就是我们递归的跳出条件,如果左边大于右边了,代表左边已经没有大于中位数的数了,反之右边也一定没有小于中位数的

image-20220126004743992

此时,交换两边不符合条件的数字,将比0大的七十八交换到右边吗,将比0小的-567交换到左边

image-20220126005002346

交换完成之后,判断左右两边此时小标的数字是否与中位数相等,如果相等就后移,不需要重复比对

此时我们的第一次循环就结束了,可以看到,数组已经被交换到了,我们的思路第一步的样子,

比中位数0 小的都在左边,比中位数0大的都在右边,之后我们需要重复递归,一直到交换不了为止

image-20220126005253580

此时 r 与l相等,就代表都到中位数了,左右两边都递归有序了,此时我们需要将l后一位,r前移一位,防止栈溢出,并且再继续向下,再最后一次递归之前会结束,

image-20220126005555036

后面的递归就是重复的分组重复的交换,一直到左索引小于又索引,代表还可以继续分组排序,直到左边递归完毕

右索引大于左索引代表可以继续向右边递归,一直到右边递归完毕

image-20220126010021201

快速排序测速

八十万长度存放0-80w的随机数

image-20220126010205710

可以看到,效率是十分的快速

image-20220126010443742

有兴趣的小伙伴可以自己试试写一个冒泡排序测试一下,再拿小冷的快速排序测试一下,算法的精妙之处一下就能感受到了

死磕GMSSL通信-java/Netty系列(二) Netty-tcnative再linux编译比较好编译,但是再window编译,我尝试了各种办法,总是编译失败,所以我采用半自动的方式进行编译,Netty-tcnative会生成临时文件,直接用vs打开,设置openssl的头文件和静态库路径,然后生成静态库,静态库改个名字放到jar包里边,其实自动编译也是这个原理哈哈O(∩_∩)O。直接传输五个证书的路径吗,之前有的是说要转成x509之类的,转来转去的有点麻烦,这个是直接传输证书路径,由底层gmssl去解析,格式必须是pem格式。然而,若项目已依赖于。 阅读详情

相关推荐

<工控><PLC>汇川Easy521系列PLC与汇川SV630N伺服进行EtherCat通讯的相关配置及指令编写

本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。

用沸腾的热血,支付我们的人生吧! 2万+

冒泡排序算法

冒泡排序:**1,**整个排序序列划分为有序区和无序区,初始状态下有序区为空,无序区包含所有即将排序的数字。 2,在无序区中相邻的数字进行比较,逆序的则交换,顺序则往后移动即可,从前往后进行。 以下为代码: #include<stdio.h> #define key 9//定义数组大小 void main() { int i, r[key],temp; int j ; for (i = 0; i < key; i++) scanf_s("%d", &r[i]); for (i =

qq_51917627的博客 172

代码复现——SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架

根据《SymAgent: A Neural-Symbolic Self-Learning Agent Framework for Complex Reasoning over Knowledge Graphs》(《SymAgent:一种用于知识图谱复杂推理的神经符号自学习Agent框架》)论文思路,简单复现代码,以实现SymAgent中的Agent-Planner和Agent-Executor模块。Agent-Planner利用大语言模型的归纳推理能力从知识图谱中提取符号规则,指导高效的问题分解。

qq_60040306的博客 1605

JAVA(python):冒泡排序算法原理及其实现

显示生活中经常会遇到将一组数进行排序,并且按从小到大或者从大到小。如果给出一组是个元素的数,让大家排序,肯定花费一点时间就能够完成。但是,如果一组数有100个、1000个,还能快速的排出来吗?因此,这里介绍一种快速排序算法冒泡排序算法,它与选择排序算法比较相似,只是排序的方式不一样。下面我们介绍冒泡排序算法的原理及步骤。

weixin_51631044的博客 693

CODESYS V3.5 SP17编程环境全攻略:从安装到多语言编程实战

本文全面解析CODESYS V3.5 SP17编程环境,从安装配置到多语言编程实战技巧。详细介绍了运行时环境设置、六种IEC 61131-3语言的特性对比与混合编程策略,以及高级功能开发如自定义算法模块和实时通信配置。适合工业自动化工程师快速掌握这一强大工具。

weixin_30632089的博客 489

【时空图神经网络 & 交通】相关模型3:STFGNN | 空间-时间依赖性 | 基于数据驱动的方法来生成“时间图” | 时空融合图模块,门控卷积模块 | 动态时间规整 | 顶会文章解析

STFGNN(时空融合图神经网络)在交通流量预测中的优势主要体现在以下几个方面:首先,它提出了一种数据驱动的方法生成“时间图”,弥补了传统空间图可能无法反映的某些相关性。其次,STFGNN通过并行处理不同时间段的空间图和时间图,有效地学习隐藏的时空依赖关系。此外,它将融合图模块与门控卷积模块整合到一个统一层中,通过层层堆叠处理长序列,进一步增强了模型的表达能力。实验结果表明,STFGNN在多个交通数据集上表现出色,优于其他基准方法,展示了其在实际应用中的强大潜力。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 384

冒泡排序(分析+代码调优)

传送门 1、冒泡排序的介绍   &nbs...

hangge的学习基地 283

[Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

分类(Classification)属于有监督学习(Supervised Learning)中的一类,它是数据挖掘、机器学习和数据科学中一个重要的研究领域。分类模型类似于人类学习的方式,通过对历史数据或训练集的学习得到一个目标函数,再用该目标函数预测新数据集的未知属性。本章主要讲述分类算法基础概念,并结合决策树、KNN、SVM分类算法案例分析各类数据集,从而让读者学会使用Python分类算法分析自己的数据集,研究自己领域的知识,从而创造价值。 19.1 分类 19.1.1 分类模型 与前面讲述的聚类模型类似

杨秀璋的专栏 2万+

经典排序算法-冒泡排序-函数调用详细解答版

经典排序算法-冒泡排序-函数调用详细解答版

weixin_42889097的博客 1639

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3038

SAP 公司间采购简介

SAP公司间采购(Intercompany Procurement)是指企业集团内部不同法人实体之间的采购和销售流程。这种流程在跨国公司或有多个独立运营子公司的企业中非常常见。SAP提供了标准的功能来处理公司间采购,确保财务和物流流程的透明性和效率。以下是SAP公司间采购的基本流程及其相关模块的简介。

我小时候很黑的博客 1378

2022: 暴杀表达式, 脚踩逆波兰的时候到了

前言 ★ 这里是小冷的博客 ✓ 优质技术好文见专栏 个人公众号,分享一些技术上的文章,以及遇到的坑 当前系列:数据结构系列 源代码 git 仓库 ‘ 数据结构代码地址 代码Git 仓库地址 认识表达式与 逆波兰计算器实现 什么是前缀,什么中缀,什么是后缀?(理论加举例) 前缀 前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将运算符写在前面,操作数写在后面。为纪念其发明者波兰数学家Jan Lukasiewicz,前缀表达式也称为“波兰式”。例如,- 1 + 2 3,它等价于1-(2+3

doomwatcher的博客 564

AI训练师三级考证避坑指南|假证辨别+机构套路+OSTA验证

这是最基础的问题,也是最容易忽略的问题。人工智能训练师三级证书本身是有价值的——政府认可的职业技能等级证书、多地紧缺工种补贴、人才引进加分。但正因为有价值,才引来了大量骗子。记住三句话OSTA查不到的证,一分钱都不值声称免考包过的,100%是骗子培训费一次性谈清楚,后续加价直接走人如果你正在考虑考人工智能训练师三级证书,想要从报名到备考到拿证的完整一站式指南,欢迎查看我的付费专栏:📖《人工智能训练师三级·从零到拿证完全指南》99篇系统化内容,覆盖报名、备考、冲刺、拿证全流程。

白话机器学习 1222

数据结构 | 十大排序超硬核八万字详解【附动图演示、算法复杂度性能分析】

🔥十大排序算法整理汇总🔥每个排序均附带动图展示、代码分析、性能测试,带你从头至尾彻底搞懂排序算法

做技术人 · 产优质博客 · 找好工作 7149

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

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

Java算法篇-排序算法

本文主要围绕排序算法展开分析了四个常用的排序算法,分别为冒牌排序、选择排序、插入排序、快速排序...

leen的博客 838

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

十大排序算法——排序算法效率比较——选择排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

一次性解决十大排序算法。

weixin_43981402的博客 743

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Rust语言的排序算法

排序算法的主要任务是将一组数据按特定顺序排列。内部排序与外部排序:内部排序是指所有待排序数据都可以放入内存中进行排序;外部排序则是对超出内存容量的数据进行排序,通常涉及到磁盘I/O操作。稳定排序与不稳定排序:稳定排序是指当两元素相等时,它们在排序后的相对位置与排序前相同;不稳定排序则不保证这一特性。比较排序与非比较排序:比较排序是通过比较元素之间的大小来进行排序(如快速排序、归并排序等);非比较排序是通过其他技术(如计数排序、桶排序等)实现排序,通常有更高的效率,但适用范围受限。

2501_91391144的博客 572

动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)

特此说明: 转载文章 博主:程序员吴师兄 链接:https://blog.youkuaiyun.com/kexuanxiu1163/article/details/103051357 java代码示例请移步博主文章,后面会自行添加C#示例 用一张图概括: 1. 冒泡排序 1.1 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第...

末零 的博客 781

Unity3D 实用技巧 - 经典排序算法回溯篇【C#】

在大数据时代中,如何从海量数据中挖掘优质内容,算法成为有效规整和利用的一种常见应用手段。同时作为程序员修炼内功最直接的途径,就是深度学习和活用这强大的算法,所以让我们奔回曾经学习的起点,回溯这经典的排序算法。诚然,我们能发现无论是算法书籍,还是论坛里面的优质文章,发现讲述经典排序算法还真不少。所以我们还是进行汇总式学习吧!直接上总概览图理论性认识经典排序算法哈。RUNOOB.COM 十大经典算法(...

unityofficial的博客 210

堆排序(C++)

堆排序(C++)

weixin_44806108的博客 4860

Open Notes: c++ template implementation of 10 common sorting algorithms; c++ 模板写的10个常用排序算法

Open Notes: C++模板式实现的10个常用排序算法 by Max Z. C. Li (maximusl@g.ucla.edu) I’m not writing dedicated blog articles but trying to keep notes of my practices. This one is inspired by Top_Spirit’s 超详细十大经典排序算法总结(java代码)c或者cpp的也可以明白; many thanks. Feel free to use any

maxzcl的博客 192

一篇文章带你搞懂七大排序

七大排序 数据结构中的重中之重啊,友友们!必学必会必掌握。 来自可爱老师的句句忠告 别记忆代码了好吗? 算法重要的是思想啊 冒泡排序 思想简述 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 图形描述 算法思路整理 根据上图我们不难发现,如果要

应钟二十六的博客 508

VSCode调试可视化终极指南:10个技巧让代码调试从此一目了然

调试代码时,你是否曾为理解复杂数据结构而头疼?VSCode调试可视化工具正是解决这一痛点的完美方案!这个强大的VS Code扩展能够将枯燥的调试数据转化为直观的可视化图表,让代码执行过程变得清晰可见。无论你是算法学习者还是专业开发者,这款调试可视化工具都能极大提升你的调试效率。 ## 🎯 什么是VSCode调试可视化工具? VSCode调试可视化工具是一个革命性的VS Code扩展,它能够*

gitblog_01178的博客 631

数据结构与算法笔记

数据结构与算法堆/栈链表树二叉树红黑树排序时间/空间复杂度

jingsuwang的博客 445

Java算法篇-查找算法&字符串匹配算法&图论算法

本文主要围绕查找算法、字符串匹配算法、图论算法进行展开分析,主要内容为二分查找、线性查找、kmp算法、dijkstra算法...

leen的博客 1469

java-数据结构-基数排序(桶排序)

java-数据结构-基数排序 基数排序(桶排序)介绍: 1.基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort, 顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 2.基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法 3.基数排序(Radix Sor...

mirana的专栏 841
上一篇: 基于redis+springboot从零开始设计一个类阿里系的单点登录
下一篇: 【排序算法】分治思想归并排序
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

冷环渊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值