七大排序算法——快速排序

news2024/11/29 12:44:11

AcWing算法专题——快速排序


文章目录

  • AcWing算法专题——快速排序
  • 前言
  • 一、快速排序的核心
  • 二、算法图示
  • 三、算法代码
  • 四、算法详解
    • 1.递归停止的条件
    • 2.下标移动的实现
    • 3.下标初始值的设定
    • 4.边界情况分析
      • 4.1区间划分
      • 4.2 do while循环条件
  • 五、思考题
  • 总结


前言

  现在我们开始进入算法模块,在分享数据结构的知识的同时开始分享编程的算法,欢迎大家交流,有不对的地方欢迎大家斧正,也希望大家集思广益,拓展思维。


一、快速排序的核心

快速排序的核心思想是——分治。
何为分治,也就是说将一个完整的区间分成两个区间,这两个区间不一定等分,但快速排序算法的难点不在于怎么分治,在于边界问题的处理,如果边界问题处理不到位很有可能会出现各种各样的错误,比如陷入死循环,算法难度不大,但是有一些细节问题还是得注意不然就会运行失败。

二、算法图示

如果满足q[i]<x,那就说明i这个位置放的是对的,就让i向后移动,直到不满足条件停止
同理j向前移动,不满足的时候停止,两个都停止了就交换两个的位置,然后判断递归是否停止,如果不停止继续递归
在这里插入图片描述

三、算法代码

void quick_sort(int q[], int l, int r)
{
    //递归的终止情况
    if(l >= r) return;
    //第一步:分成子问题
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while(i < j)
    {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }
    //第二步:递归处理子问题
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
    //第三步:子问题合并.快排这一步不需要操作,但归并排序的核心在这一步骤
}

四、算法详解

1.递归停止的条件

  我们设置了两个特殊的端点,左端点和右端点,如果左端点大于等于右端点就说明我们所给数组只有一个元素无需排序或者已经递归结束,无论那种情况都要递归停止。

2.下标移动的实现

  我们采用do while这种循环方式来实现,用其他方式也可以做到,但是这里建议用do while更加直观。

3.下标初始值的设定

  因为我们不可能直接去移动左右端点的下标,这样会影响我们后续的操作,所以我们设置了两个变量 i 和 j来存储下标,我们采用的do while循环的特点是先执行后判断,所以我们初始条件就得是左端点的前一个和右端点的后一个位置,如下图:
在这里插入图片描述

4.边界情况分析

4.1区间划分

快排属于分治算法,最怕的就是 n分成0和n,或 n分成n和0,这会造成无限划分
1.用i划分,x不可以选择q[l]。
2.用j划分,x不可以选择q[r].
上述两种情况会造成无限划分。
关键句子quick_sort(q, l, j), quick_sort(q, j + 1, r);
由于j的最小值是l,所以q[j+1…r]不会造成无限划分
但q[l…j](即quick_sort(q, l, j))却可能造成无限划分,因为j可能为r
举例来说,若x选为q[r],数组中q[l…r-1] < x,这一轮循环结束时i = r, j = r,显然会造成无限划分

4.2 do while循环条件

do i++; while(q[i] < x)和do j–; while(q[j] > x)不能用q[i] <= x 和 q[j] >= x
假设q[l…r]全相等,则执行完do i++; while(q[i] <= x);之后,i会自增到r+1,然后继续执行q[i] <= x 判断条件,造成数组下标越界,之后的q[i] <= x (此时i > r) 条件也成立,会超出内存。

五、思考题

大家可以在评论区讨论一下快速排序的时间复杂度是多少?
答案下期公布哦~

总结

快排总结:
1.确定数组q,确定左端点l,确定右端点r。
2.确定划分边界x
3.按照划分的边界x将数组分成<=x,>=x的两个区间。
4.分别递归处理两个区间。
快排定下划分边界x后就从左右端点位置开始向中间走,两个区间中不满足就停下,同时停下了就交换数据然后继续向下走,直到两个下标相等了或者左边区间的下标大于右边区间的下标了就停止,也就完成了快排。
如果大家还有什么其他思路欢迎大家交流,这个模板也有可以改进的地方,欢迎大家来斧正~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第一章 虚拟机】

第一章 虚拟机 1. 虚拟机VM ①虚拟机就是一台虚拟的计算机&#xff0c;它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。 ②虚拟机分为系统虚拟机和程序虚拟机。系统虚拟机&#xff08;比如VMware&#xff09;,它们完全是对物理计算机的仿真&#xff0c;提供了一个可运…

瑞芯微rk3568移植openbmc(三)

2022.11.04 更新 1、关于h264 novnc openbmc中使用的ipkvm其server端调用的是libvncserver库&#xff0c;而其web client端调用的则是novnc的库&#xff0c;既上篇研究修改了libvncserver后&#xff0c;再次继续研究了一下novnc。 Github搜索一圈以后&#xff0c;发现https://…

Java设计模式之单例模式详细讲解

设计模式与单例模式 1、什么是单例模式 ​ 单例模式是指保证某个类在整个软件系统中只有一个对象实例&#xff0c;并且该类仅提供一个返回其对象实例的方法&#xff08;通常为静态方法&#xff09; 2、单例模式的种类 ​ 经典的单例模式实现方式一般有五种 2.1 饿汉式 //…

【SpringBoot】SpringBoot整合SpringSecurity+thymeleaf实现认证授权(配置对象版)

一.概述 1.框架概述 Spring Security 是 Spring 家族中的一个安全管理框架&#xff0c;Spring Security 的两大核心功能就是认证&#xff08;authentication&#xff09;和授权&#xff08;authorization&#xff09;。 认证 &#xff1a;你是什么人。授权 &#xff1a;你能…

RHCE学习 --- 第一次作业

RHCE学习 — 第一次作业 首先我们先设置网卡开机自动启动 vi /etc/sysconfig/network-scripts/ifcfg-ens160 最下面修改ONBOOTyes 然后安装好chrony&#xff0c;配置/etc/chrony.conf文件&#xff0c;添加题目要求的时间服务器 然后设置一个例行性工作&#xff0c;每天早上九…

美国FBA海运专线究竟是什么?美国fba海运专线都有那些?

美国FBA海运专线究竟是什么?美国FBA特别航运线&#xff0c;顾名思义就是海运发送的特别货运线&#xff0c;那么它的收费标准是什么呢?一、美国FBA海运专线究竟是什么 美国FBA特别航运线&#xff0c;顾名思义就是海运发送的特别货运线&#xff0c;那么它的收费标准是什么呢? …

猿创征文|『编程与创作』10款颜值颇高的宝藏工具

&#x1f31f;个人主页&#xff1a;Mymel_晗&#xff0c;一名喜欢鼓捣 Java 的在校学生。 &#x1f31f;撸代码本来是一件枯燥的事情&#xff0c;而一款高颜值工具加持可能会让你事半功倍&#xff0c;今天就给大家推荐一下我在大学学习中发现的几款颜值工具~ 从写代码&#xff…

录音m4a怎么转换成mp3

有小伙伴问手机录音文件电脑上播放不了怎么办&#xff1f;这是很多小伙伴在用手机录完音后遇到最多的问题&#xff0c;尤其是那些第一次遇到这个问题的人&#xff0c;根本不知道这是什么原因导致的&#xff0c;还总以为自己的录音文件出了问题&#xff0c;回去检查发现手机上还…

03-Nginx性能调优与零拷贝

目录 Nginx 性能调优 零拷贝&#xff08;Zero Copy&#xff09; 零拷贝基础 A、 实现细节 B、 总结 零拷贝方式 A、 实现细节 B、 总结 A、 实现细节 B、 总结 A、 实现细节 B、 总结 Nginx 性能调优 在 Nginx 性能调优中&#xff0c;有两个非常重要的理论点&#xff08;面试点…

【C++红黑树】带图详细解答红黑树的插入,测试自己的红黑树是否正确的代码

目录 1.红黑树的概念 1.1红黑树的特性&#xff08;41&#xff09; 2.红黑树的框架 3.红黑树的插入 3.1parent在grandfather的左边 3.1parent在grandfather的右边 4.测试自己的红黑树是不是平衡的 1.红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个…

米联客FDMA3.1数据缓存方案全网最细讲解,自创升级版,送3套视频和音频缓存工程源码

米联客的FDMA数据缓存方案发布也有五六年了&#xff0c;但真正能熟练使用的兄弟却很少&#xff0c;其实还是没有好的例程作为参考和同熟易懂的讲解&#xff0c;这里我做如下解析&#xff1a; FDMA部分&#xff1a;这部分是米联客封装了用户接口的AXI4-FULL协议代码&#xff0c;…

xhs-web校验流程分析

经测试&#xff0c;cookie中需携带gid和timestamp2。参数整理有点乱&#xff0c;仅供参考。 xhsFingerprintV3&#xff0c;VERSION: ‘2.1.2’ 文章目录流程概述timestamp2滑块验证参数Params轨迹FNcaptcha deviceIdProfileDatax-s-commonx5生成x8生成x9生成smidV2a1x-b3-trac…

Jenkins配置linux节点

之前在Windows下安装Jenkins 但是通过windows节点进行构建有诸多的不便&#xff0c;于是想到通过Jenkins里添加linux节点&#xff0c;让构建的时候&#xff0c;使用远程的linux服务器构建 目录一、配置凭据二、配置节点一、配置凭据 Manage Jenkins → Manage Credentials→Je…

Cadence Allegro PCB设计88问解析(十三) 之 Allegro中artwork层的建立

一个学习信号完整性的layout工程师 作为layout工程师&#xff0c;我们经常接触到的是PCB文件&#xff0c;用Cadence设计的是.brd文件。但是我们发给板厂的都是gerber文件。这就涉及到在我们设计好PCB文件之后&#xff0c;怎么把这些文件给到板厂。也就是我们Allegro中的artwork…

Java知识点--IO流(上)

Java知识点--IO流&#xff08;上&#xff09;一、文件1、文件的含义2、文件流二、常用的文件操作1、创建文件对象相关构造器和方法2、创建文件案例演示&#xff08;三种创建方法&#xff09;3、获取文件相关信息的方法4、获取文件相关信息方法案例演示5、目录的操作与删除6、应…

电脑系统重装下载的系统在哪找到

​因为现在很多人都在使用小白一键重装系统&#xff0c;但是很多人都不太能够了解小白系统重装下载的系统在哪儿&#xff0c;下面是小编提供的具体位置供大家参考。 工具/原料&#xff1a; 系统版本&#xff1a;win10 品牌型号&#xff1a;联想yoga13 软件版本&#xff1a;小白…

期货开户有什么规定

有很多朋友刚刚接触到资本市场&#xff0c;当他们听到期货时&#xff0c;他们觉得它非常遥远和高端&#xff0c;这是普通人无法接触到的。但事实上&#xff0c;情况并非如此。期货是一种非常普通的金融产品&#xff0c;很容易接触。让我们来看看期货开户有哪些必要条件以及有什…

postman环境变量的设置

背景&#xff1a;由于我们项目接口入参都有加密&#xff0c;每次接口调试都得启动项目&#xff0c;运行项目才能把对应的参数给传到后台&#xff0c;然后后台再解密参数&#xff0c;才能进行接口调试&#xff0c;很麻烦&#xff08;启动前端项目&#xff09;&#xff0c;如果接…

Linux篇【3】:Linux环境基础开发工具使用(中)

目录 一、Linux 编译器&#xff1a;gcc/g 的使用 1.1、知识拓展&#xff1a; 1.2、如何安装 C/C 标准静态库&#xff1a; 1.3、头文件与库文件&#xff1a; 1.4、静态库&#xff0c;静态链接&#xff0c;动态库&#xff0c;动态链接&#xff1a; 二、简单 vim 配置 2.1、…

【SpringBoot】一文了解SpringBoot热部署

文章目录前言手动启动热部署热部署种类手动进行热部署自动启动热部署热部署范围配置热部署的关闭总结&#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;一文彻底搞懂SpringBoot热部署&#x1f30e; ✅系列专栏&#xff1a;Sp…