数据结构算法-快速排序算法

核心思路

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

快速排序算法核心思路

选择一个“基准”元素,将数组分为两个子数组,一个包含比基准小的元素,另一个包含比基准大的元素,然后对这两个子数组进行递归排序。

基准数

初始化两个索引 i 和 j,分别子数组的开头和结尾。
初始化基准元素 base 为子数组的第一个元素。
如果子数组的长度大于1,执行以下步骤:
通过循环移动指针 j 从右向左,直到找到一个小于基准的元素或达到 i 的位置。
如果找到一个小于基准的元素,将其与 i 指向的元素交换,并将 i 向右移动一位。
通过循环移动指针 i 从左向右,直到找到一个大于基准的元素或达到 j 的位置。
如果找到一个大于基准的元素,将其与 j 指向的元素交换,并将 j 向左移动一位。
将基准元素放到 i 的位置。
返回 i 的值,表示基准元素在排序后的数组中的位置。

快速排序步骤

首先检查 low 是否小于 higt,如果不是,则说明子数组的长度小于等于1,不需要排序,直接返回。
调用 findbaseNum 函数找到基准元素的位置 baseIndex。
递归调用 QuickSort 函数对基准元素左边的子数组进行排序。
递归调用 QuickSort 函数对基准元素右边的子数组进行排序。

快速排序算法专区

// 定义一个函数FindBaseNum,它接受一个整数数组arr和两个整数Low和High作为参数。  
int FindBaseNum(int arr[], int Low, int High) {  // 初始化两个索引,i子数组的起始位置,j子数组的结束位置。  int i = Low;  int j = High;  // 选取子数组的第一个元素作为"基准"(pivot),也称为"轴"元素。  int base = arr[Low];  // 检查子数组的长度,如果子数组只有一个或没有元素,那么就没有排序的必要。  if (Low<High){  // 当i小于j时,循环继续。这个循环是快速排序的关键步骤,它不断地将数组划分为两部分,一部分是小于基准的元素,另一部分是大于基准的元素。  while (i<j) {  // 在j指针逐渐向内移动的过程中,检查其是否指向了一个小于或等于基准的元素。如果是,则继续移动。这个步骤确保了所有大于基准的元素都位于其左侧。  while (i<j&& arr[j]>=base) {  j--;  }  // 如果i小于j,将当前j指向的元素与i指向的元素交换。这一步操作确保了所有小于基准的元素都位于其右侧。同时,由于i指针已经移动到了一个位置,所以我们需要将其增加1以便在下一次迭代中检查正确的位置。  if (i<j) {  arr[i++] = arr[j];  }  // 确保了所有小于基准的元素都位于其右侧。同时,由于我们已经知道所有大于基准的元素都位于其左侧,所以我们可以简单地移动i指针来查找正确的位置。  while (i < j && arr[i] < base) {  i++;  }  // 如果i小于j,将当前i指向的元素与j指向的元素交换。这一步操作确保了基准位于其最终的位置上。同时,由于j指针已经移动到了一个位置,所以我们需要将其减少1以便在下一次迭代中检查正确的位置。  if (i < j) {  arr[j--] = arr[i];  }  }  // 将基准放在其最终的位置上。此时,我们只需要对基准左侧和右侧的两个子数组进行相同的操作即可完成排序。  arr[i] = base;  }  // 返回基准的位置索引。  return i;  
}// 定义一个函数QuickSort,它接受一个整数数组arr,以及两个整数low和higt作为参数。  
void QuickSort(int arr[], int low, int higt) {  // 如果low小于higt,则执行以下操作。这是递归的终止条件,意味着当low大于或等于higt时,数组已经被排序,不需要继续排序。  if (low<higt){  // 调用FindBaseNum函数来找到基准元素的索引。这个函数应该返回基准元素的位置。  int baseIndex = FindBaseNum(arr, low, higt);  // 对基准元素左边的子数组进行快速排序。  QuickSort(arr, low, baseIndex);  // 对基准元素右边的子数组进行快速排序。  QuickSort(arr, baseIndex + 1, higt);  }  
}

优化版,函数指针

// 函数 FindBaseNum 的定义。它接受一个整数数组 arr、两个整数 Low 和 High,  
// 以及一个函数指针 comp,该函数用于比较两个整数。  
int FindBaseNum(int arr[], int Low, int High,bool(*comp)(const int&,const int&)) {  // 初始化两个指针,i 指向子数组的起始位置,j 指向子数组的结束位置。  int i = Low;  int j = High;  // 选择子数组的第一个元素作为基准(pivot)。  int base = arr[Low];  // 如果子数组的长度大于1(至少有一个元素需要排序),则执行以下操作。  if (Low < High) {  // 当 i 小于 j 时,继续循环。这个循环是快速排序的关键步骤,它不断地将数组划分为两部分,  // 一部分是小于基准的元素,另一部分是大于基准的元素。  while (i < j) {  // 当 i 小于 j 且 arr[j] 大于或等于基准时,移动 j 指针到更小的位置。这确保了所有大于基准的元素都在其左侧。  while (i < j && !comp(arr[j],base)) {  j--;  }  // 如果 i 小于 j,交换 arr[i] 和 arr[j] 的值。这确保了所有小于基准的元素都在其右侧。  if (i < j) {  arr[i++] = arr[j];  }  // 当 i 小于 j 且 arr[i] 小于基准时,移动 i 指针到更小的位置。这确保了所有大于基准的元素都在其右侧。  while (i < j && comp(arr[i],base)) {  i++;  }  // 如果 i 小于 j,交换 arr[j] 和 arr[i] 的值。这确保了基准位于其最终的位置上。  if (i < j) {  arr[j--] = arr[i];  }  }  // 将基准放在其最终的位置上。此时,我们只需要对基准左侧和右侧的两个子数组进行相同的操作即可完成排序。  arr[i] = base;  }  // 返回基准的位置索引。  return i;  
}  // 函数 QuickSort 的定义。它接受一个整数数组 arr、两个整数 low 和 high,以及一个函数指针 comp,该函数用于比较两个整数。  
void QuickSort(int arr[], int low, int higt, bool(*comp)(const int&, const int&)) {  // 如果 low 小于 higt(子数组的长度大于1),则执行以下操作。  if (low < higt) {  // 找到基准的位置索引。  int baseIndex = FindBaseNum(arr, low, higt,comp);  // 对基准左侧的子数组进行快速排序。  QuickSort(arr, low, baseIndex,comp);  // 对基准右侧的子数组进行快速排序。  QuickSort(arr, baseIndex + 1, higt,comp);  }  
}  // 函数 QuickSort 的另一个定义,它接受一个整数数组 arr、数组的大小 size,以及一个函数指针 comp,该函数用于比较两个整数。  
void QuickSort(int arr[],int size, bool(*comp)(const int&, const int&)) {  // 如果 size 大于1且 comp 不为空(存在比较函数),则执行以下操作。这是递归的终止条件,意味着当 size 小于或等于1或 comp 为空时,数组已经被排序,不需要继续排序。  if (size>1&&comp) {  QuickSort(arr, 0, size-1, comp); // 从子数组的起始位置到结束位置进行排序。  }  
}

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

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

相关文章

2.[BUU]rip

1.检查文件--》checksec 一下 查看之后发现是64位&#xff0c;直接放入IDA64进行反编译。 2.IDA反编译&#xff0c;进行分析 发现是gets()函数可以造成栈溢出&#xff0c;从而可以覆盖栈上的内容。 想法&#xff1a;通过gets函数&#xff08;栈溢出&#xff09;来篡改栈上的内…

Java代码解析:初学者的编程入门指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 Java作为一门强大而广泛应用的编程语言&#x…

速通Python基础语法--变量篇

Python设计哲学 解决一个问题&#xff0c;只提供一种方案&#xff1a;变量类型 写法灵活,一行代码表达更多意思,提高语言表达能力:动态类型(两面性) 颜色标识&#xff1a; 紫色&#xff1a;Python与C语言的区别 一、常量与表达式 二、变量 1、认识变量&#xff08;存数据&am…

国产ToolLLM的课代表---OpenBMB机构(清华NLP)旗下ToolBench的安装部署与运行(附各种填坑说明)

ToolBench项目可以理解为一个能直接提供训练ToolLLM的平台&#xff0c;该平台同时构建了ToolLLM的一个开源训练指令集。&#xff0c;该项目是OpenBMB机构&#xff08;面壁智能与清华NLP联合成立&#xff09;旗下的一款产品&#xff0c;OpenBMB机构名下还同时拥有另外一款明星产…

HQL的其他优化

CBO优化 CBO是指Cost based Optimizer&#xff0c;即基于计算成本的优化。 在Hive中&#xff0c;计算成本模型考虑到了&#xff1a;数据的行数、CPU、本地IO、HDFS IO、网络IO等方面。Hive会计算同一SQL语句的不同执行计划的计算成本&#xff0c;并选出成本最低的执行计划。目前…

Windows本地搭建开源企业管理套件Odoo并实现公网访问

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

Java接收并解析HL7协议数据

一、前言 HL7协议相信医疗行业的IT人员都不陌生&#xff0c;笔者由于接触时间比较短&#xff0c;乍一听“协议”还是比较懵&#xff0c;不自觉就把它和“HTTP”、"SOAP”之类的网络协议挂上关联&#xff0c;可事实上这个HL7只是一种数据格式&#xff0c;传输方式也可以使用…

Mac managing Multiple Python Versions With pyenv 【 mac pyenv 管理多个python 版本 】

文章目录 1. 简介2. 安装2.1 brew 安装 pyenv2.2 脚本安装 3. pyenv 安装 Python4. 卸载 python5. 管理 python 1. 简介 Pyenv 是一个用于管理和切换多个 Python 版本的工具。它允许开发人员在同一台计算机上同时安装和使用多个不同的 Python 版本&#xff0c;而无需对系统进行…

Elasticsearch 索引生命周期和翻滚 (rollover) 策略

Elasticsearch 是搜索引擎中的摇滚明星&#xff0c;它的蓬勃发展在于使你的数据井井有条且速度快如闪电。 但当你的数据成为一场摇滚音乐会时&#xff0c;管理其生命周期就变得至关重要。 正确使用索引生命周期管理 (ILM) 和 rollover 策略&#xff0c;你的后台工作人员可确保顺…

万户OA text2Html接口存在任意文件读取漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品&#xff0c;统一的基础管理平台&#xff0c;实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网…

ABAP与HANA集成 2:ABAP调用HANA存储过程或SQL语句

作者 idan lian 如需转载备注出处 需求 虽然是做BW模块&#xff0c;但是最近项目上种种&#xff0c;都需要给ABAP人员或者前台用户提供能供他们使用的表&#xff0c;就稍微研究了下ABAP和HANA的集成问题&#xff0c;因为我们BW更擅长的还是HANA&#xff0c;而且HANA的运行效…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(二)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xff08;一&#xff09; 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

NVMe前世今生

NVMe前世今生 1 NVMe的由来2 NVMe工作原理3 NVMe优点4 NVMe适用场景 本文属于《 NVMe协议基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 NVMe的由来 目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口&#xff0c;接口协议为 AHCI&a…

vue + element 项目表格多选根据状态来禁用

首先如图效果 对elementUI中table表格的多选框进行 可勾选 和 不可勾选 的处理 给 type 属性为 selection 的加一个事件:selectableselected’ <el-table-column type"selection" width"55" :selectable"selected"> </el-table-colum…

运维知识点-Kubernetes_K8s

Kubernetes RBAC配置不当攻击场景攻击过程 RBAC配置不当 Service Account本质是服务账号&#xff0c;是Pod连接K8s集群的凭证。 在默认情况下&#xff0c;系统会为创建的Pod提供一个默认的Service Account&#xff0c; 用户也可以自定义Service Account&#xff0c;与Service…

目标检测——YOLO算法解读(通俗易懂版)

论文&#xff1a;You Only Look Once: Unified, Real-Time Object Detection 作者&#xff1a;Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi 链接&#xff1a;https://arxiv.org/abs/1506.02640 代码&#xff1a;http://pjreddie.com/yolo/ yolo系列检测算法开…

Excel小技能:excel如何将数字20231211转化成指定日期格式2023/12/11

给了一串数字20231211&#xff0c;想要转成指定格式的日期格式&#xff0c;发现设置单元格格式为指定日期格式不生效&#xff0c;反而变成很长很长的一串#这个&#xff0c;如图所示&#xff1a; 其实&#xff0c;正确的做法如下&#xff1a; 1&#xff09;打开数据功能界面&am…

谷达冠楠科技:抖音店铺被退店是什么意思

随着互联网的普及和发展&#xff0c;电商平台已经成为了人们购物的主要渠道之一。在众多的电商平台中&#xff0c;抖音作为短视频领域的佼佼者&#xff0c;也吸引了大量的商家入驻。然而&#xff0c;有些商家可能会遇到抖音店铺被退店的情况&#xff0c;那么这究竟是什么意思呢…

病案管理的定义、流程及应用分析

病案管理是指针对病人的基本信息&#xff0c;病历&#xff0c;就诊记录等进行收集、整理、存储、分析和应用的一项管理工作。它在医院、医疗机构和医疗行业中具有重要的作用&#xff0c;能够提高医疗服务的质量、效率和安全性。本文将就病案管理的定义、流程以及其在医疗健康领…

React实现全局Loading

css #__loading {position:fixed;top: 0;left: 0;z-index: 99999;display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;background: rgba(0, 0, 0, 0); } 页面代码 使用了antd的Spin组件 import React from react import ReactDOM from re…