快速排序图文详细教程

news2025/8/11 16:27:43

文章目录

文章目录

      • 文章目录
    • @[toc]
  • 一、快排思路
  • 二、相关代码
  • 小细节改进
    • 版本一
    • 版本二

一、快排思路

还记得之前的荷兰国旗问题吗(快排的前身:详解荷兰国旗问题),快排其实就是借助这种思路,在每次遍历中以第一个数作为目标数,将数组排为一个该数左边的数都比它小,右边的数都比它大的数的数组,换句话说通过一轮这样的操作就找到了该数在数组顺序后的位置,重复这样的操作n次我们就找了该数组中每一个数的位置完成了排序,具体思路看下图:

遍历一个数组使其左边都是比第一个数小的数,其右边都是比它大的数:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

如果理解了这个过程,我们来再看一个总体的排序过程图解,具体如下:
在这里插入图片描述

使用具体的步骤描述这个过程:

思路:

  1. 以数组中第一个元素为flag
    设置两个下标 i=1 ; j=n-1
  2. 移动j直至找到第一个比flag小的元素;
    然后移动i,直至找到第一个比flag大的数;
  3. 如果此时i,j的值时合法的,则交换a[i], a[j](合法的意思就是i<j
    如果不合法,说明我们将数组中的元素遍历完毕了。
  4. 比较flaga[i]的值,如果flag>a[i]那么交换a[0]a[i]的值,否则交换a[0]a[i-1]的值。这样就找到了a[0]在该数组中排序后的位置。
  5. 使用以上四个步骤分别遍历找到位置的元素(a[i]或a[i-1])的左边所有元素和右边所有元素的子数组。
  6. 重复以上操作,直至找到所有元素的位置。

二、相关代码

int partition(int* arr, int n) {
    int key = arr[0];
    int i=1;
    int j=n-1;
    while(i<j) {
        while(i<j && key<arr[j]) --j;
        if(i>=j) break;
        while(i<j && key>arr[i]) ++i;
        if(i>=j) break;

        SWAP(arr[i], arr[j]);
        ++i;
        --j;
    }

    if(key > arr[i]) {
        return i;
    }else {
        return i-1;
    }
}

void quick_sort(int* arr, int n) {
    if(n<=1) return;
    int p = partition2(arr, n);
    SWAP(arr[0], arr[p]);
    quick_sort(arr, p);
    quick_sort(arr+p+1, n-p-1);
}

小细节改进

版本一

由于我们在最初的版本里面设置了的i=1,两者在比较的过程中设置每次在交换之后,移动i, j,但这使得在返回下表的时候还要对flaga[i]进行比较,但事实上,我们可以直接让两个下表自己跑,满足条件则交换,具体如下:

int partition1(int* arr, int n) {
    int key = arr[0];
    int i = 0, j = n-1;

    while(i < j) {
        while(i<j && key <= arr[j])  --j; 
        while(i<j && key >= arr[i])  ++i;
        SWAP(arr[i], arr[j]);
    }

    arr[i] = key;
    return i;

}
void quick_sort(int* arr, int n) {
    if(n<=1) return;
    int p = partition2(arr, n);
    quick_sort(arr, p);
    quick_sort(arr+p+1, n-p-1);
}

版本二

我们将数组中的第一个元素存在了key里面,那么此时arr[0]可以作为交换两个数的中间变量,具体实现如下:

int partition2(int* arr, int n) {
    int key = arr[0];
    int i=0, j=n-1;
    while(i < j) {
        while(i<j && key <= arr[j]) --j;
        arr[i] = arr[j];
        while(i<j && key >= arr[i]) ++i;
        arr[j] = arr[i];
    }
    arr[i] = key;
    return i;
}

void quick_sort(int* arr, int n) {
    if(n<=1) return;
    int p = partition2(arr, n);
    quick_sort(arr, p);
    quick_sort(arr+p+1, n-p-1);
}

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

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

相关文章

[模型部署]:深度学习模型部署(已更Pytorch篇)

模型部署一、Pytorch 模型部署1. 模型保存1.1. 使用torch.save()保存1.2. 使用[torch.jit.save()](https://pytorch.org/docs/stable/generated/torch.jit.save.html)保存2. 模型部署 or 模型编译2.1. TorchScript部署2.2. TensorRT部署2.3. TVM部署2.4. Laser部署模型部署 一…

STM32 GD32 标准库移植SFUD

本次移植是在官方源码的基础上进行移植的 本次介绍的两个软件包SFUD/FAL都与FLASH有关&#xff0c;并且都可以独立使用或者结合在一起使用&#xff0c;两个软件包都对操作系统无依赖&#xff0c;可以使用裸机移植&#xff0c;也很方便移植到各种系统。 这两个软件包的作者都是…

Java JDK安装与配置

Java JDK安装与配置 JDK下载 下载地址&#xff1a;JDK下载 最上方是JDK最新版&#xff0c;往下滑将看到最常用的稳定版本&#xff1a;JDK8 选择版本 勾上选框&#xff0c;点击下载 登录Oracle账号&#xff1a; 没有账号可注册或网上寻找账号&#xff0c;建议自行注册登录成功…

我应该是懂居家办公的吧?

近期的广州疫情十分严峻&#xff0c;海珠区&#xff0c;公司那边的地铁停了。 于是成为了一个【天选居家人】。 天河这边还好一点&#xff0c;起码可以下楼做核酸&#xff0c;买菜&#xff0c;拿快递&#xff0c;出入凭24h核酸。 有人说&#xff1a;以前在公司工作总盼望居家办…

Win10配置IIS与 C#/.net项目的发布与IIS部署

1、IIS配置安装 已经安装IIS的可以跳过 在左下搜索框搜索 “启用或关闭windows功能” 点开&#xff0c;勾选如下图所示勾选框后&#xff0c;点击“确定”后进行安装。 安装完成。在搜索框搜索输入IIS&#xff0c;如图&#xff0c;打开IIS应用。 打开后如图所示 2、在VS中打包…

详解c++----类和对象(二)

目录标题前言为什么会有默认成员函数有哪些默认成员函数构造函数和析构函数为什么会有这两个函数构造函数的简介构造函数的调用构造函数的重载构造函数的缺省参数析构函数的简介析构函数的特性析构函数的例子重回构造函数第一点第二点究竟什么是默认构造函数默认构造函数所带来…

Wnt 信号通路

Wnt 信号通路是一种古老的、进化上保守的通路。其中&#xff0c;Wnt 蛋白属于分泌的糖蛋白&#xff0c;可与卷曲蛋白 (Frizzled) 家族的受体&#xff0c;如与脂蛋白受体相关的蛋白 5/6 (LRP5/6)&#xff0c;Ror2 和 Ryk 相互作用&#xff0c;导致各种细胞内信号传导级联激活&am…

【创建小程序】微信如何创建小程序?

说起我们日常所使用的微信&#xff0c;大家一定也会联想到微信小程序。微信小程序跟微信一样拥有着很高的使用频率&#xff0c;而且微信小程序也成为了很多企业商家除了网站APP以外的必备轻应用。那么在微信如何创建小程序呢&#xff1f;下面给大家简单说说。 一、准备好小程序…

如何优雅地校验后端接口数据,不做前端背锅侠

背景 最近新接手了一批项目&#xff0c;还没来得及接新需求&#xff0c;一大堆bug就接踵而至&#xff0c;仔细一看&#xff0c;应该返回数组的字段返回了 null&#xff0c;或者没有返回&#xff0c;甚至返回了字符串 "null"&#xff1f;&#xff1f;&#xff1f; 这…

【BOOST C++ 13 并行编程】(5) Boost.Atomic

一、说明 Boost.Atomic 提供类 boost::atomic&#xff0c;可用于创建原子变量。它们被称为原子变量&#xff0c;因为所有访问都是原子的。 Boost.Atomic 用于多线程程序&#xff0c;当在一个线程中访问变量不应被访问相同变量的另一个线程中断时。如果没有 boost::atomic&#…

Windows取证——隐藏用户

前言&#xff1a; 实验环境&#xff1a;Windows server 2019 实验目的&#xff1a;了解Windows隐藏账户的工作原理&#xff0c;有针对性地对隐藏账户进行应急处置。 目录 前言&#xff1a; 一、隐藏用户的建立 二、查看隐藏用户 法一&#xff1a;计算机管理本地用户和组查看…

Java集合(复习)

Java中的集合 Java中的集合概述Collection 接口中常用的方法Iterator 迭代器forEach 增强for循环Collection子接口之一&#xff1a;List 接口ArrayList 源码分析LinkedLIst 源码分析Vector 源码分析List 接口常用的方法Collection 子接口之二&#xff1a; Set 接口HashSetLinke…

OnlineJudge平台(负载均衡)

文章目录1.所用技术与开发环境2.项目宏观结构3.compiler服务设计4. 基于MVC结构的oj服务设计5. 前端页面设计6 安装指南升级 gcc安装 jsoncpp安装 cpp-httplib安装boost库安装与测试 ctemplate使用Ace在线编辑器&#xff08;直接复制粘贴即可&#xff09;在线OJ样例题目MySQL 建…

SVN的基本使用

文章目录1.什么是SVN&#xff1f;2.SVN跟Git比,有什么优势&#xff1f;3.SVN的主要应用4.SVN仓库(SVN的服务端)5.SVN客户端6.SVN的基本操作6.1 代码检出 checkout6.2添加文件 add6.3提交代码 commit6.4 更新代码 update7.撤销和恢复7.1 撤销本地修改7.2 撤销已提交内容7.3 恢复…

第一章《初学者问题大集合》第5节:Java开发环境的搭建

上一小节阐述了Java程序运行的过程和原理&#xff0c;但那都一些理论&#xff0c;并没有真正的实战操作。此时读者们肯定想知道&#xff1a;从哪里才能搞到一个编译器和那个传说中能让Java程序得以运行的虚拟机呢&#xff1f;有了虚拟机&#xff0c;又怎样才能让Java程序在电脑…

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统

[附源码]计算机毕业设计JAVA广州中小学学校信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

ASEMI代理艾赛斯IXFK32N100P,车规级MOS管IXFK32N100P

编辑-Z 艾赛斯车规级MOS管IXFK32N100P参数&#xff1a; 型号&#xff1a;IXFK32N100P 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;1000V 连续漏电流&#xff08;ID&#xff09;&#xff1a;32A 功耗&#xff08;PD&#xff09;&#xff1a;960W 工作结温度&am…

一文带你快速了解【内部类】

1. 什么是内部类&#xff1f; 在一个类 A 中&#xff0c;又定义了一个类 B &#xff0c;此时这个类 B 就是内部类&#xff0c;而类 A 则是外部类&#xff01;内部类也是一种封装得表现 public class A{class B{} }我们看上面代码&#xff0c;此时 A 就是外部类&#xff0c;B …

美团外卖搜索基于Elasticsearch的优化实践

美团外卖搜索工程团队在Elasticsearch的优化实践中&#xff0c;基于Location-Based Service&#xff08;LBS&#xff09;业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-Length Encoding&#xff08;RLE&#xff09;设计了一款高效的倒排索引结构&#xff0c;使检索…

蚂蚁集团最新业绩出炉:净利润同比下降63%,连续三个季度下滑

11月17日&#xff0c;阿里巴巴集团&#xff08;简称“阿里”&#xff0c;HK:09988、NYSE:BABA&#xff09;公布2023财年第二季度&#xff08;对应自然年2022年第三季度&#xff09;业绩。财报显示&#xff0c;阿里巴巴2022年第三季度的收入为人民币2071.76亿元&#xff08;约合…