百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT精选 > 正文

CSP-J/S 算法探秘:全方位解析快速排序

ccwork 2025-04-10 21:09 7 浏览

算法探秘:全方位解析快速排序

在历年提高组的初赛中,出现了很多与快速排序有关的题目,例如2024年阅读程序第一题的recursion()函数、2023年选择第10题、2020年阅读程序第二题等,而快速排序的思想也是一些利用二分法优化算法的基础,因此本期算法探秘,将带着大家全方位地解析快速排序。

快速排序的基本思路

快速排序是在冒泡排序的基础上使用分治算法进行的优化。冒泡排序中,每一轮的比较都能确定好一个元素的位置,因此最多n-1轮比较才能确定好每一个元素的位置,所以其时间复杂度为O(n^2)。但是如果采用某种分治策略,让每一轮确定更多元素的位置,这就是快速排序的基础。

快速排序的基本思想是,先选取一个元素作为基准数,将小于它的都放到它左边,大于它的都放到它右边,此时,基准数的位置一定是排序好的位置。再对左右两部分进行相同的操作,直到拆分成每部分只有1个数,最终结果即为升序的排序结果。

快速排序是一种不稳定的排序方法,但是其效率非常快,快于多数常用的排序算法。

基础版快速排序的过程

以数组a[10]={5,2,3,9,4,8,7,1,6,4)为例,每次选取区间的第一个元素作为基准数,模拟快速排序的过程:

1、第一轮比较与交换

(1)基准为a[0]=5,剩余数字的左边界i=1,右边界j=9;

(2)先看右边界,a[j] = 4<5,j不变;

(3)再看左边界,a[i] = 2<5,i++;

(4)重复第3步,直到i=3时,a[i] = 9>5,i不用再变;

(5)交换a[i]与a[j],即9与最后的4,第一次边界移动完成,数组变为{5,2,3,4,4,8,7,1,6,9},这时候我们发现,两个相同的元素“4”的相对位置发生了变化,因此快速排序是不稳定的排序;

(6)判断i<j,还要继续,重复2~5步;

(7)右边j继续左移,直到j=7时,a[j]=1<5;

(8)左边 i继续右移,直到i=5时,a[i]=8>5;

(9)交换a[i]与a[j],2次边界移动后,数组变为{5,2,3,4,4,1,7,8,6,9};

(10)判断i<j,边界移动继续;

(11)右边j继续左移,直到j=5时,a[j]=1<5;

(12)左边i想要继续右移,但是j左移后,i==j,因此i右移强制结束,i=5;

(13)由于i==j,a[i]与a[j]进行了一次无用的交换;

(14)最后将a[0]与a[i]交换,数组变为{1,2,3,4,4,5,7,8,6,9},并记住i=5;

第一轮排序后,a[5]=5已经确定好它的位置了,因此接下来要对两端进行排序;


2、第二轮的比较与交换

(1)a[0]~a[4]与a[6]~a[9]两部分同时进行;

(2)第一部分看到其实已经有序了,因此如果进行比较与交换过后,只会产生a[0]与a[1]~a[4]这样两个子区间。因此,本来就有序的数组,根据上面的规则,又得要判断拆分4次才能确定下来,这时候就需要考虑优化算法了。

(3)第二部分在经过新一轮比较与交换后,可以二分成{6}和{8,9}两个无序序列,并且确定a[7]=7这个元素的位置;

(4)根据上述的分析,样例数组在第一轮快速排序后就可以结束排序了,但是根据快速排序的原理,超过1个元素的区间还要再次进行,会进行多余的比较,因此算法还需要优化。

基础版快速排序部分代码展示

int a[maxn];
void Quick_sort(int l, int r){
  if(l>=r) return;
  int x=a[l];
  int i=l+1, j=r;
  while(i<j){
    while(i=x){
      j--;
    }
    while(i<j && a[i]<=x){
      i++;
    }
    swap(a[i],a[j]);
  }
  swap(x,a[i]);
  Quick_sort(l,i-1);
  Quick_sort(i+1,r);
}

快速排序的多种改良


根据上述对第二轮排序的分析,有多种改良快速排序的方法可以参考:

(1)针对有序或者倒序数组的情况,我们在选取基准数时,改为选择区间中间的数字,这样确保每次递归时总能将数组分为左、右两个区间。由于中间值正好是数组的最大值或最小值的可能性较小,较难出现最差情况;

(2)当二分到每个区间很小时,快速排序的效率就不高了,并且这个时候区间数组基本是有序的了,因此这时候可以改用插入排序,利用好插入排序在最好的情况下时间复杂度为O(n)的特点。

(3)对于已经有序的区间序列,在进行快速排序的比较和交换判断时,不会进行任何一次交换,因此在交换的地方可以做一个计数,如果没有进行交换,那么这个序列肯定是有序的,就不用再递归下去。

快速排序的时空复杂度分析

根据快速排序的思想,理想状态下,第一轮排序确定1个元素的位置,第二轮排序确定2个元素的位置,第三轮排序确定4个元素的位置……以此类推,只需要logn轮排序就能完成,而每轮排序还是遍历整个数组,因此快速排序的平均时间复杂度为O(nlogn)。如果数组是有序或倒序的,那么快速排序无法将数组正确地二分成2个区间,因此时间复杂度会退化成O(n^2)

快速排序是对数组原地排序的算法,因此数组的空间占用就为n。但是由于算法采用递归实现,递归调用栈内存的空间复杂度平均为O(logn),最坏情况为O(n)。

相关推荐

二十三、Java类与对象简介(java第十一章类和对象)

在Java编程语言中,类(Class)和对象(Object)是面向对象编程(OOP)的核心概念。描述类类是Java程序的基本组成单元,是对象的模板。类定义了对象的属性和方法。属性是对象的状态信息,而方...

设计模式-结构型-代理模式(proxy)

1.概念需要给对象提供一个代理以控制对该对象的访问,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介;根据代理类生成时机不同,分为静态代理和动态代理;静态代理代理类在编...

深度解析设计模式七大原则之——里氏替换原则

临近端午节,各位读者,你们假期行程安排好了吗?“菜鸟”已经做好决定了,谁都不能阻拦(产品经理也不行),“菜鸟”要好好在家休息三天。最近实在是太累了,一直在疯狂的加班。好了好了言归正传,开始我们的正文。...

Java代理模式详解:智能中介的编程艺术

一、生活场景中的代理思维想象您要租房子,但不想直接与房东打交道,这时房产中介就发挥作用了:1.中介帮您筛选房源(访问控制)2.签约前验证房东资质(预处理)3.协助办理合同手续(功能增强)4.处...

哪个创意最能打动你? 为你欣赏的“创意之星”投一票

这一期的《超级课堂·暑期特别活动》将评出5位“创意之星”,获得价值2000元的奖品。本期我们选登了部分中小学生在昙华林留下的创意作品,欢迎为最能打动你的作品投上一票。大众评审目前采取微信投票:扫描二维...

Netty基础—6.Netty实现RPC服务(netty reactor)

大纲1.RPC的相关概念2.RPC服务调用端动态代理实现3.Netty客户端之RPC远程调用过程分析4.RPC网络通信中的编码解码器5.Netty服务端之RPC服务提供端的处理6.RPC服务调用端实现...

静态代理和动态代理(静态代理和动态代理的优缺点)

1.什么是代理很多人肯定听过和看到过飞机票代理点,火车票代理点。那这些代理点干得事情就是帮航空公司,火车站出售火车票的工作。它们算是一个中间商。实际的服务不是由它们提供。而是由真正的服务商提供。通过这...

Java反射机制与Spring动态代理深度解析

一、Java反射机制原理剖析1.1反射的本质与实现基础Java反射(Reflection)是Java语言的核心特性,允许程序在运行时:动态加载类获取类结构元数据操作类属性和方法关键技术支撑:java...

Java 代理模式详解(java代理原理)

1.代理模式代理模式是一种比较好理解的设计模式。简单来说就是我们使用代理对象来代替对真实对象(realobject)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象...

SpringBoot全局异常处理:如何优雅应对多系统多格式错误响应需求

SpringBoot全局异常处理:如何优雅应对多系统多格式错误响应需求引言部分在微服务架构中,你是否曾为处理不同外部系统的异常响应而头痛?A系统要求返回JSON格式的:{code:1001,mes...

3分钟吃透代理技术!(代理一般都是怎么做)

最近有学员问了我一些问题,什么是代理,又该在什么地方使用。结合之前的讨论,这篇文章我们一起细致的讲解一下关于代理的一些问题。在Java中,代理通常分为两类:静态代理动态代理两者技术实现是不一样的,...

苏州网络维护 | 学习网络维护,从哪入手

我们想要学习网络维护,从哪入手呢?先带大家了解下网络维护1.培养基础知识:建立对计算机网络基本原理的理解。学习计算机网络的基础概念,如IP地址、子网掩码、路由器、交换机、协议等。2.学习网络技术:深入...

CAD如何快速一键编号?(cad如何一次性全部编号)

cad一键自动编号。·第一步,在命令行数abh空格。·第二步,打开自动编号对话框,选择用默认的图言编号,编号文字的高度根据图纸的大小设置零点八。当然如果图纸很大,设置比如十一百的有可能数字编号,这点很...

职场新人必知的10个高效工作法,助你快速升职加薪

初入职场,面对繁杂的工作任务和陌生的职场环境,如何才能快速适应并脱颖而出?以下是10个高效工作法,帮助职场新人提升工作效率,快速实现升职加薪的目标。---1.制定每日工作计划-推荐理由:每天开始...

《魔导英雄传说》新手攻略,快速升级,礼包码,最强阵容排列

《魔导英雄传说》新手攻略一、武将培养指南英雄选择与培养:英雄品质分为SSR、SR、A,优先培养SSR英雄,如张飞、孙尚香等核心英雄阵营搭配:同阵营上阵英雄越多,战力加成越高,建议优先培养同一阵营的英雄...