【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

目录
- 一、挖坑填补法
- 二、区间分割法
- 三、快排的优化:
快排的基本思想:先确定一个标准值,将比标准值小的元素放在标准值的左侧,比标准值大的元素放在右侧,左右部分分别重复以上的操作,直到整个数组有序。
快速排序是基于分治策略的排序算法
一、挖坑填补法
- 选择一个基准元素
- 将基准元素挖出,形成一个坑
- 从右向左遍历数组,找到第一个比基准元素小的元素,将其填入空坑中,并将此位置视为新的坑
- 从左向右遍历数组,找到第一个比基准元素大的元素,将其填入新的空坑中,并将此位置视为新的坑
- 重复过程,直到左右指针相遇
- 最后将基准元素填入坑中,此时基准元素左边的所有元素都比它小,右边的所有元素都比它大。
- 对基准元素左边和右边的子数组递归地进行上述操作,直到整个数组有序

C++代码:
#include <iostream>
#include <cmath>
using namespace std;int partition(int arr[], int left, int right)
{// 确定标准值,保存起来int standard = arr[left];//使用双指针从两端开始,将比标准值大的数放到标准值右侧,小于标准值的放到左侧while (left < right){//从右到左(right到left)找到比标准值小的//如果遇到的值大于等于标准值,则跳过 right--while (left < right && arr[right] >= standard){right--;}//找到了比标准值小的值arr[right],放到左边的left坑中arr[left] = arr[right];//从左到右(left到right)找到比标准值大的//如果遇到的值小于等于标准值,则跳过 left++while (left < right && arr[left] <= standard){left++;}//找到了比标准值大的值arr[left],放到左边的right坑中arr[right] = arr[left];}//中间的坑放入标准值arr[left] = standard;//返回标准值的下标return left;
}void quicksort(int arr[], int left, int right)
{if (arr == NULL || left >= right) return;int standard = partition(arr, left, right);quicksort(arr, left, standard - 1);quicksort(arr, standard + 1, right);
}void print(int arr[], int len)
{if (arr == NULL || len <= 0) return;for (int i = 0; i < len; i++){std::cout << arr[i] << " ";}std::cout << endl;
}int main()
{int arr[] = { 5, 1, 7, 0, 4, 3, 4, 9, 6 };int len = sizeof(arr) / sizeof(arr[0]);cout << "------------------------------" << endl << "原始序列:";print(arr, len);quicksort(arr, 0, len - 1);cout << "------------------------------" << endl << "排序后序列:";print(arr, len);return 0;
}

二、区间分割法
#include <iostream>
#include <cmath>
using namespace std;int partition(int arr[], int left, int right)
{int nSmall = left - 1;for (left; left < right; left++){if (arr[left] < arr[right]){//小区间扩张if (++nSmall != left){arr[nSmall] = arr[nSmall] ^ arr[left];arr[left] = arr[nSmall] ^ arr[left];arr[nSmall] = arr[nSmall] ^ arr[left];}}}//将标准值放入if (++nSmall != right){arr[nSmall] = arr[nSmall] ^ arr[right];arr[right] = arr[nSmall] ^ arr[right];arr[nSmall] = arr[nSmall] ^ arr[right];}return nSmall;
}
void print(int arr[], int len)
{if (arr == NULL || len <= 0) return;for (int i = 0; i < len; i++){std::cout << arr[i] << " ";}std::cout << endl;
}int main()
{int arr[] = { 5, 1, 7, 0, 4, 3, 4, 9, 6 };int len = sizeof(arr) / sizeof(arr[0]);cout << "------------------------------" << endl << "原始序列:";print(arr, len);quicksort(arr, 0, len - 1);cout << "------------------------------" << endl << "排序后序列:";print(arr, len);return 0;
}
三、快排的优化:
- 1.标准值的选取:选取三个数字(头、尾、中间),选择大小为中间值的
- 2.分割到数据较少时,不再使用快排,使用插入排序
- 3.使用栈取代递归
- 4.尾递归
以下为使用了标准值三选一、按情况使用插入排序的优化后代码:
class Solution {
public:void swap (vector<int>& nums, int i, int j) { int temp = nums[i];nums[i] = nums[j];nums[j] = temp;} void insertSort (vector<int>& nums, int left, int right) {for (int i = left+1; i <= right; i++) {int temp = nums[i];int j = i-1;for (j = i-1; j >= 0; j--) {if (temp < nums[j]) {nums[j+1] = nums[j];continue;} break;}nums[j+1] = temp;}} int place(vector<int>& nums,int left,int right){//标准值三选一int mid = left + (right-left)/2;if (nums[left] > nums[right]) swap(nums,left,right);if (nums[mid] > nums[right]) swap(nums,mid,right);if (nums[mid] > nums[left]) swap(nums,mid,left); int standard = nums[left];while(left < right){while(left<right&&nums[right]>standard){right--;}nums[left] = nums[right];while(left<right&&nums[left]<standard){left++;}nums[right] = nums[left];}nums[left] = standard;return left;}void quickSort(vector<int>& nums,int left,int right){//分割到数据较少时,不再使用快排,使用插入排序if (right - left <= 5) {insertSort(nums,left,right);return;} if(nums.size() == 0 || left >= right) return;int standard = place(nums,left,right);quickSort(nums,left,standard-1);quickSort(nums,standard+1,right);}vector<int> sortArray(vector<int>& nums) {quickSort(nums,0,nums.size()-1);return nums;}
};

| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |
相关文章:
【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 更多算法分析与设计知识专栏:算法分析🔥 给大家跳…...
OSPF动态路由实验(华为)
思科设备参考:OSPF动态路由实验(思科) 一,技术简介 OSPF(Open Shortest Path First)是一种内部网关协议,主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议,通过…...
EasyRecovery2024专业免费的电脑数据恢复软件
EasyRecovery数据恢复软件是一款功能强大的数据恢复工具,广泛应用于各种数据丢失场景,帮助用户从不同类型的存储介质中恢复丢失或删除的文件。 该软件支持恢复的数据类型非常广泛,包括但不限于办公文档、图片、音频、视频、电子邮件以及各种…...
Vue集成PageOffice实现在线编辑word、excel(前端配置)
一、什么是PageOffice PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。可以给文件添加水印,在线安全预览防止用户下载…...
IBM SPSS Statistics for Mac:数据分析的卓越工具
IBM SPSS Statistics for Mac是一款功能强大的数据分析软件,专为Mac用户设计,提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生,都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…...
python爬虫------- Selenium下篇(二十三天)
🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…...
获取字符串的全排列(去除字符串中2个字符相同时造成的重复)
一、概念 现有一个字符串,要打印出该字符串中字符的全排列。 以字符串abc为例,输出的结果为:abc、acb、bac、bca、cab、cba。 以字符串aab为例,输出的结果为:aab、aba、baa。 二、代码 public class Permutation {pub…...
HTML5新增的多媒体标签
在网页中加入音乐 <audio></audio> src 设置音乐文件名以及路径,<audio>标记支持MP3、WAV及OGG 3种音乐格式 autoplay:是否自动播放,加入autopaly属性表示自动播放 controls: 是否显示播放面板,加入controls属性表示显示播放面板 …...
温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用
前言 对于一些单片机类的环境检测或者智能家居小项目中,温湿度传感器(DHT11)以及光照强度传感器(BH1750)往往是必不可少的两个外设,下面我们来剖析这两个外设的原理,以及使用。 1. 温湿度传感…...
ActiveMQ 04 Linux下安装
Active MQ 04 Linux下安装 下载 解压 在init.d下建立软连接 ln -s /usr/local/activemq/bin/activemq ./设置开启启动 chkconfig activemq on 服务管理 service activemq start service activemq status service activemq stopNIO配置 默认配置为tcp,使用的…...
.pyc 文件是什么?是否有必要同步到 GitHub 远程仓库?
git status 时发现有很多 .pyc 的没有被 add (env) username:~/path/to/project$ git status On branch main Your branch is up to date with origin/main.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file: xxx.pyCha…...
Zookeeper的集群搭建和ZAB协议详解
Zookeeper的集群搭建 1)zk集群中的角色 Zookeeper集群中的节点有三个角色: Leader:处理集群的所有事务请求,集群中只有一个LeaderFollwoer:只能处理读请求,参与Leader选举Observer:只能处理读…...
STM32 MPU配置参数
TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强(TEX - C - B- S). #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 ÿ…...
Kafka概述
目录 1、为什么需要消息队列(MQ) 2、使用消息队列的好处 3、消息队列的两种模式 4、Kafka 定义 5、Kafka 简介 6、Kafka 的特性 7、Kafka 系统架构 8、Partation 数据路由规则 9、分区的原因 1、为什么需要消息队列(MQ) …...
OpenHarmony编译构建系统
这篇来聊聊OpenHarmony的编译构建,经过前面的实践,再来看编译构建。 编译构建概述 在官网中提到了,OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…...
Qt5 编译oracle数据库驱动
库文件 1、Qt源码目录:D:\Qt5\5.15.2\Src\qtbase\src\plugins\sqldrivers\oci 2、oracle客户端SDK: https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 下载各版本中的如下压缩包,一定要版本相同的 将两个压缩包…...
UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~
UE5的自定义按键和UE4有所不同,在这里记录一下。 本文主要是记录如何设置UE5的自定义按键,重点是学会原理,实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射,而是按键的激活方式࿰…...
为什么把script标签放在div下面?
放在底部可以优先加载页面的内容结构,提升页面渲染速度。只有等到HTML解析完成后,才会开始执行main.js,避免JS阻塞页面解析, 同时main.js里可能会操作DOM,如果放头部,可能会找不到节点而报错 <body><div id"root"><App></App>&l…...
Git 自定义命令
前言 在使用 hexo 搭建个人博客时,共两种部署的方法。分别为: 本地利用 hexo 的插件 hexo-deployer-git 来实现部署,缺点是需要多敲几个命令行且不方便对源码进行云端备份使用 Github Action 的 workflow 自动化部署,优势就是可…...
SpringBoot多数据源配置及使用
1.application.properties数据配置 首先现在配置文件中定义三个数据库相关信息 # 数据库1 targetLibraryMain.datasource.url jdbc:kingbase8://127.0.0.1:54321/DATA_ONE?useUnicodetrue&characterEncodingutf8&serverTimezoneGMT%2B8&allowMultiQueriestrue …...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
