当前位置: 首页 > news >正文

【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、挖坑填补法
  • 二、区间分割法
  • 三、快排的优化:

快排的基本思想:先确定一个标准值,将比标准值小的元素放在标准值的左侧,比标准值大的元素放在右侧,左右部分分别重复以上的操作,直到整个数组有序。

快速排序是基于分治策略的排序算法

一、挖坑填补法

  1. 选择一个基准元素
  2. 将基准元素挖出,形成一个坑
  3. 从右向左遍历数组,找到第一个比基准元素小的元素,将其填入空坑中,并将此位置视为新的坑
  4. 从左向右遍历数组,找到第一个比基准元素大的元素,将其填入新的空坑中,并将此位置视为新的坑
  5. 重复过程,直到左右指针相遇
  6. 最后将基准元素填入坑中,此时基准元素左边的所有元素都比它小,右边的所有元素都比它大。
  7. 对基准元素左边右边的子数组递归地进行上述操作,直到整个数组有序

image.png

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;
}

image.png

二、区间分割法

#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;}
};

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

相关文章:

【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法分析与设计知识专栏&#xff1a;算法分析&#x1f525; 给大家跳…...

OSPF动态路由实验(华为)

思科设备参考&#xff1a;OSPF动态路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…...

EasyRecovery2024专业免费的电脑数据恢复软件

EasyRecovery数据恢复软件是一款功能强大的数据恢复工具&#xff0c;广泛应用于各种数据丢失场景&#xff0c;帮助用户从不同类型的存储介质中恢复丢失或删除的文件。 该软件支持恢复的数据类型非常广泛&#xff0c;包括但不限于办公文档、图片、音频、视频、电子邮件以及各种…...

Vue集成PageOffice实现在线编辑word、excel(前端配置)

一、什么是PageOffice PageOffice是一款在线的office编辑软件&#xff0c;帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转&#xff0c;领导批阅&#xff0c;盖章。可以给文件添加水印&#xff0c;在线安全预览防止用户下载…...

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…...

python爬虫------- Selenium下篇(二十三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…...

获取字符串的全排列(去除字符串中2个字符相同时造成的重复)

一、概念 现有一个字符串&#xff0c;要打印出该字符串中字符的全排列。 以字符串abc为例&#xff0c;输出的结果为&#xff1a;abc、acb、bac、bca、cab、cba。 以字符串aab为例&#xff0c;输出的结果为&#xff1a;aab、aba、baa。 二、代码 public class Permutation {pub…...

HTML5新增的多媒体标签

在网页中加入音乐 <audio></audio> src 设置音乐文件名以及路径,<audio>标记支持MP3、WAV及OGG 3种音乐格式 autoplay&#xff1a;是否自动播放,加入autopaly属性表示自动播放 controls&#xff1a; 是否显示播放面板,加入controls属性表示显示播放面板 …...

温湿度传感器(DHT11)以及光照强度传感器(BH1750)的使用

前言 对于一些单片机类的环境检测或者智能家居小项目中&#xff0c;温湿度传感器&#xff08;DHT11&#xff09;以及光照强度传感器&#xff08;BH1750&#xff09;往往是必不可少的两个外设&#xff0c;下面我们来剖析这两个外设的原理&#xff0c;以及使用。 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&#xff0c;使用的…...

.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&#xff09;zk集群中的角色 Zookeeper集群中的节点有三个角色&#xff1a; Leader&#xff1a;处理集群的所有事务请求&#xff0c;集群中只有一个LeaderFollwoer&#xff1a;只能处理读请求&#xff0c;参与Leader选举Observer&#xff1a;只能处理读…...

STM32 MPU配置参数

TXE LEVEL一般只用MPU_TEX_LEVEL0 1 - 1 - 1 -0性能最强&#xff08;TEX - C - B- S&#xff09;. #define MPU_TEX_LEVEL0 ((uint8_t)0x00) #define MPU_TEX_LEVEL1 ((uint8_t)0x01) #define MPU_TEX_LEVEL2 ((uint8_t)0x02) 基于上表进行常用配置 &#xff…...

Kafka概述

目录 1、为什么需要消息队列&#xff08;MQ&#xff09; 2、使用消息队列的好处 3、消息队列的两种模式 4、Kafka 定义 5、Kafka 简介 6、Kafka 的特性 7、Kafka 系统架构 8、Partation 数据路由规则 9、分区的原因 1、为什么需要消息队列&#xff08;MQ&#xff09; …...

OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建&#xff0c;经过前面的实践&#xff0c;再来看编译构建。 编译构建概述 在官网中提到了&#xff0c;OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…...

Qt5 编译oracle数据库驱动

库文件 1、Qt源码目录&#xff1a;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 下载各版本中的如下压缩包&#xff0c;一定要版本相同的 将两个压缩包…...

UE5学习日记——实现自定义输入及监听输入,组合出不同的按键输入~

UE5的自定义按键和UE4有所不同&#xff0c;在这里记录一下。 本文主要是记录如何设置UE5的自定义按键&#xff0c;重点是学会原理&#xff0c;实际开发时结合实际情况操作。 输入映射 1. 创建输入操作 输入操作并不是具体的按键映射&#xff0c;而是按键的激活方式&#xff0…...

为什么把script标签放在div下面?

放在底部可以优先加载页面的内容结构,提升页面渲染速度。只有等到HTML解析完成后,才会开始执行main.js,避免JS阻塞页面解析&#xff0c; 同时main.js里可能会操作DOM,如果放头部,可能会找不到节点而报错 <body><div id"root"><App></App>&l…...

Git 自定义命令

前言 在使用 hexo 搭建个人博客时&#xff0c;共两种部署的方法。分别为&#xff1a; 本地利用 hexo 的插件 hexo-deployer-git 来实现部署&#xff0c;缺点是需要多敲几个命令行且不方便对源码进行云端备份使用 Github Action 的 workflow 自动化部署&#xff0c;优势就是可…...

SpringBoot多数据源配置及使用

1.application.properties数据配置 首先现在配置文件中定义三个数据库相关信息 # 数据库1 targetLibraryMain.datasource.url jdbc:kingbase8://127.0.0.1:54321/DATA_ONE?useUnicodetrue&characterEncodingutf8&serverTimezoneGMT%2B8&allowMultiQueriestrue …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...