排序(6)——快速排序算法之挖坑版&前后指针版

目录

挖坑版

基本思路

代码实现

 注意点

前后指针版

基本思路

代码实现

注意点


由于hoare版本的快速排序有很多坑和需要注意的地方,就会导致代码写起来不容易,这里我们给出两种不同的单趟排序思路:挖坑版&前后指针版

挖坑版

基本思路

先将第一个数记作key,然后把它当作一个坑位。右边先走找小,找到后填补到坑位上,然后该位置变成新的坑位。接着左边走找大,找到后再将该数填到坑位上,该位置变成新坑位。如此循环往复,直到二人相遇,再把key填补到相遇点。

如下为图解

代码实现

  • 注意:holei是下标!!
// 挖坑法
int PartSort2(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int key = a[begin];int holei = begin;while (begin < end){// 右边找小,填到左边的坑while (begin < end && a[end] >= key){--end;}a[holei] = a[end];holei = end;// 左边找大,填到右边的坑while (begin < end && a[begin] <= key){++begin;}a[holei] = a[begin];holei = begin;}a[holei] = key;return holei;
}

 注意点

  • holei是下标
  • key是最左边的值,则right先走
  • key是最右边的值,则left先走
  • 要记得将坑位转移
  • 时间复杂度:O(N)

该方法本质上还是hoare的思想,在性能上并没有比hoare好,但是更好理解

前后指针版

基本思路

首元素为key,设置两个指针cur和prev,prev指向第一个元素,cur指向它的下一个元素。

  • cur找大比key值大的值,++cur
  • cur找到比key值小的值,++prev,交换prev和cur位置的值,++cur

关于交换:

  • prev可能会和cur指向同一个值,这个时候他们两个还没有分开。
  • 当二者拉开距离,prev就会和远处的cur交换值了。此时的prev就是比key要大的值,因为cur在之前已经过滤掉了这些数,从而达到小值换到前面,大值换到后面的效果。

如下图解 

我们可以看出,这就类似于推箱子,遇到比key小的值了后,一直将7和9往后退,将小的那个值往前推。

代码实现

//前后指针
int PartSort3(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int prev = begin;int cur = prev + 1;while (cur <= end){if (a[cur] < a[keyi] && ++prev != cur)Swap(&a[prev], &a[cur]);++cur;}Swap(&a[prev], &a[keyi]);keyi = prev;return keyi;
}

注意点

  • 如果++prev==cur的话,那就是自己和自己交换,那么在这里是没有必要的,我们可以直接让cur++即可,所以我们将它归并到else里。
  • keyi是下标
  • 注意结束条件,cur<=end要加等号,因为当cur==end的时候,还要判断。只有当它越界的时候才跳出循环。
  • 时间复杂度:O(N)

这三种方法单趟排序出来的结果都不一样!!注意区分。

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

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

相关文章

Python 读取写入excel文件

使用Python读取和写入excel的xlsx、xls文件 目录 读取xlsx文件 安装三方库 引入三方库 读取数据 打开文件 表名 最大行数 最大列数 读取一张表 读取整个文件 返回xls整体内容 安装三方包 读取内容 写入xls文件 引入三方库 创建文件并写入数据 报错及解决 报错…

一、系统架构

1系统架构师概述和意义&#xff1a; 系 统 架 构 是 系 统 的 一 种 整 体 的 高 层 次 的 结 构 表 示 &#xff0c; 是 系 统 的 骨 架 和 根 基 &#xff0c; 其 决 定 了 系 统 的 健 壮 性 和 生 命 周 期 的 长 短 。 2定义 项 目 的 总 设 计 师 &#xff0c; 他 是 …

房屋租赁系统|基于 Mysql+Java+JSP技术的房屋租赁系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 源码获取 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 随着科学技术的飞速发展&#xff0c;社会的方方面面…

SQL语言(数据库编程)

一.select查询 在数据库编程中,SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库管理系统(RDBMS)的标准编程语言。其中,SELECT 是 SQL 中最常用的查询语句,用于从数据库表中检索数据。 下面是一个基本的 SELECT 查询的示例: SELECT column1…

说一下HTML5有哪些新特性?

新增语义化标签&#xff0c;音频视频标签 新增DOM查询 --- querySelector() 、 querySelectorAll() canvas绘图 --- 用js绘制图像&#xff0c;可绘制一些基本图形、动画&#xff0c;适合做游戏 SVG绘图 --- 可缩放矢量图形&#xff0c;可绘制一些基本图形&#xff0c;适合做地图…

Flutter APP下载更新

由于我做的项目不是放在APP商店&#xff08;公司内部用&#xff09;的&#xff0c;一些flutter的第三方库不合适我&#xff0c;我需要用的是从网上下载再安装&#xff08;从服务下&#xff09;&#xff0c;网上也找了花了我好几天时间。不全又乱&#xff0c;这我自己做一下备份…

ODI报错

三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Start generation of map physical design: MapPhysicalDesign New_Mapping.物理 三月 08, 2024 1:20:09 下午 oracle.odi.mapping 信息: Finished generation of map physical design: MapPhysicalDesign New_Mapping.物…

HTML—基本介绍

HTML是一种超文本标记语言(HyperText Markup Language)&#xff0c;用于创建网页的标记语言超文本&#xff1a;是指页面内可以包含图片、链接、声音、视频等内容标记&#xff1a;HTML富含大量的标签供程序员使用&#xff0c;通过标记符号来规定指定内容的样式 浏览器最终根据不…

HybridCLR热更新介绍

官方文档 参照视频 HybridCLR介绍 HybridCLR是一个特性完整、零成本、高性能、低内存的近乎完美的Unity全平台原生c#热更方案 HybridCLR与ToLua/XLua、ILRuntime有什么不同 什么是游戏热更新&#xff1a;有热更的游戏更新流程 游戏热更新的种类 资源热更新&#xff1a;主要…

内存分区与具体介绍:

1. 内存分区图&#xff1a; 2. 分区介绍&#xff1a; 2.1. 栈区&#xff1a; 存放&#xff1a;临时的局部变量、函数的传参 特点&#xff1a;占用内存小&#xff0c;速度快 数据的存储和释放采用栈式结构&#xff0c;先入后出&#xff0c;类似于C下类的构造析构函数 2.2. 堆区&…

在Linux(Ubuntu)中使用终端编译 vscode安装

文章目录 &#x1f4da;在Linux&#xff08;Ubuntu&#xff09;中使用终端编译&#x1f407;.cpp程序编译&#x1f407;.py程序编译&#x1f407;查看Python、C编程环境 &#x1f4da;vscode安装 &#x1f4da;在Linux&#xff08;Ubuntu&#xff09;中使用终端编译 虚拟机安装…

【硬件工程师面经整理25_AD】

文章目录 1 AD设计电路全流程2 ad和cadence区别-逻辑上的区别 1 AD设计电路全流程 软件AD or 模拟数字&#xff1f; 软件AD&#xff1a;AD设计电路全流程包括以下步骤&#xff1a;选择AD库和添加、画原理图、PCB布局、PCB布线、PCB打样、PCB加工 模拟数字&#xff1a; 需求分…

实现HttpServletRequest下多次获取流数据

HttpServletRequest下多次获取流数据 背景示例错误的尝试全局替换执行顺序 背景 ​众所周知request的输入流只能读取一次&#xff0c;不能重复读取。而在HttpServletRequest中&#xff0c;获取请求体数据的流&#xff08;通过getInputStream()方法&#xff09;默认只能被读取一…

移动端精准测试之跨版本覆盖率合并

一&#xff0c;项目简介 在移动端项目测试过程中&#xff0c;尤其是发版前的回归测试阶段&#xff0c;会遇到这样的情况&#xff0c;在测试过程中测试不断地发现问题&#xff0c;开发就进行修改&#xff0c;然后打包测试。而测试完成后呢&#xff0c;业务测试同学想知道整个回归…

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中&#xff0c;网络通信已成为不可或缺的一部分。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块&#xff0c;探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

【HarmonyOS】ArkTS-对象方法

目录 对象方法实例 对象方法 方法作用&#xff1a;描述对象的具体行为 约定方法类型 interface 接口名称 { 方法名: (参数:类型) > 返回值类型 }interface Person{dance: () > voidsing: (song: string) > void}添加方法&#xff08;箭头函数&#xff09; let ym: P…

电商数据分析18——电商广告投放的数据分析与优化

目录 写在开头1. 电商广告投放的挑战与机遇1.1 广告投放的主要目标与挑战1.2 广告数据分析的价值 2. 数据分析在广告投放中的应用2.1 目标受众分析与精准定位2.2 广告效果评估与ROI分析2.3 A/B测试与广告内容优化 3. 广告投放优化的实践案例3.1 案例分享&#xff1a;精准定向提…

springboot使用EasyExcel实现Excel导入导出

java生成Excel比较有名的框架有Apache poi、jxl等&#xff0c;但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。…

微前端之再说无界的使用

运行模式 保活模式单例模式重建模式 生命周期改造 改造入口函数&#xff1a; 应用间通信 原理props 通信 主应用可以通过 props 注入数据和方法&#xff1a;子应用可以通过 $wujie 对象来获取数据&#xff1a; window 通信 主应用调用子应用的全局数据&#xff1a;子应用调用主…

每天学习一个Linux命令之find

每天学习一个Linux命令之find 概述 在Linux系统中&#xff0c;find命令是一个非常强大的工具&#xff0c;用于查找和操作文件和目录。它可以根据一些条件来搜索指定路径下的文件&#xff0c;并执行相应的操作。本篇博客将详细介绍find命令的各个可用选项及其用法。 基本语法…