快排补充(挖坑法,lomuto前后指针,非递归法)

挖坑法

挖坑法动态示意图

挖坑法方法分析

创建左右指针。⾸先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新 的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结 束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标)。注意这里用的是lift<right此处的和快排的有区别,具体的情况需要根据实际情况进行区分。

源代码

int _QuickSort(int* arr, int left, int right)
{int hole = left;int base = arr[hole];while (left < right){while (left < right && arr[right] > base){right--;}arr[hole]=arr[right];hole = right;while (left < right && arr[left] < base){left++;}arr[hole] = arr[left];hole = left;}//此时已经不满足,left<=right这时候把hole和关键值进行置换arr[hole] = base;return hole;
}

lomuto前后指针

创建前后指针,从左往右找⽐基准值⼩的进⾏交换,使得⼩的都排在基准值的左边。

前后指针方法分析

静态分析示意图

 思路:定义两个变量prev和cru这两个指针,用cur指向的位置与key的值进行对比,具体具有以下两者情况。

若arr[cru]<arr[key],pre向后移动,并把pre所指向的值与cru的值进行交换。

若arr[cru]>=arr[key],cru向继续后移动,当小于时再进行pre的后移动,并把pre所指向的值与cru的值进行交换。

前后指针方法的缺点

arr[cur]<arr[base]?

arr[cur]<=arr[base]?

 在这这两种情况下我们可以看出不论是小于等于还是小于,其实都会分成不均匀的两部分,这样会使后面递归调用的时间复杂较差。遇见相同元素的序列时使用前后指针效果较差,但是总体来说先后指针的思路和代码还是很好用的。

源代码

int _QuickSort(int* arr, int left, int right)
{int base = left;int prev = left;int cur = left + 1;while (cur<=right){if( arr[cur]<arr[base]&& (++prev)!=cur){swap(&arr[prev], &arr[cur]);}cur++;}swap(&arr[base], &arr[prev]);return prev;
}

非递归法

非递归法方法分析

示意图
  1. 找关键值的方法并未改变,可以使用(hoare,挖坑法,快慢指针)这三种方法。
  2. 根据基准值划分左右区间,左区间:[begin,keyi-1],右区间:[keyi+1,end]。两个注意点当区间的左侧大于右侧,或者左右两侧是一个相同的树就不在入栈了。
  3. 借助栈使用栈的循环模拟实现递归的功能。这里要注意入栈是先进后出,所以先right再入left。
  4. 循环到栈为空为止。

非递归的优点

  1. 避免栈溢出:递归调用函数可能会导致栈溢出,特别是在处理大规模数据时。使用非递归的方式可以避免这种情况的发生。

  2. 更容易实现:非递归的快速排序实现相对简单,不需要考虑递归调用的细节,也不需要处理递归栈的问题。

  3. 更容易优化:非递归的快速排序可以更容易地进行优化,例如使用迭代代替递归、使用栈来存储待处理的子数组等。

源代码

void swap(int* n, int* m)
{int temp = *n;*n = *m;*m = temp;
}
void QuickSortNonR(int* arr, int left, int right)
{ST st;StInit(&st);StPush(&st, right);StPush(&st, left);while (!StEmpty(&st)){//取栈顶元素---取两次int begin = StTop(&st);StPop(&st);int end = StTop(&st);StPop(&st);//[begin,end]---找基准值int prev = begin;int cur = begin + 1;int keyi = begin;while (cur <= end){if (arr[cur] < arr[keyi] && ++prev != cur){swap(&arr[cur], &arr[prev]);}cur++;}swap(&arr[keyi], &arr[prev]);keyi = prev;//根据基准值划分左右区间//左区间:[begin,keyi-1]//右区间:[keyi+1,end]//当左边大于右边或者值相同不入栈if (keyi + 1 < end){StPush(&st, end);StPush(&st, keyi + 1);}if (keyi - 1 > begin){StPush(&st, keyi - 1);StPush(&st, begin);}}StDestory(&st);
}

总结

以上就是咱们本次的内容,本次内容对快排进行了补充,从而更好的理解了非递归的方法。后续会继续补充,期待各位大佬支持一键三连(点赞,收藏,关注)。

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

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

相关文章

P2P 文件共享:现代网络中的高效文件传输

在互联网的世界中&#xff0c;不同应用程序的数据传输方法各异。P2P文件共享&#xff08;Peer-to-Peer File Sharing&#xff09; 作为一种高效的文件传输方式&#xff0c;使得用户可以在没有中央服务器的情况下直接进行文件交换。本文将详细介绍P2P文件共享的基本原理、优势及…

vue3实现系统tab标签页面切换

功能&#xff1a; 支持刷新当前、关闭其他、关闭全部、关闭当前支持打开多个相同path不同路由参数的页面&#xff0c;将fullPath作为路由页面唯一值 UI组件&#xff1a; 使用的是element-plus中的el-tab组件&#xff0c;结构目录如下 代码实现&#xff1a; 下面是 TagsView…

缺失ffmpeg.dll要用什么修复方法?快速恢复丢失的ffmpeg.dll文件

多媒体软件用户常常会遭遇一个提示&#xff1a;系统无法找到ffmpeg.dll文件。这类情况经常在启动视频编辑软件、流媒体播放应用或其他音视频处理工具时出现&#xff0c;导致相关程序无法正确加载和执行。ffmpeg.dll是一种关键的动态链接库文件&#xff0c;负责处理复杂的视频和…

【实战教程】一键升级CentOS 7.9.2009至OpenSSL 1.0.2u:加固你的Linux服务器安全防线!

文章目录 【实战教程】一键升级CentOS 7.9.2009至OpenSSL 1.0.2u&#xff1a;加固你的Linux服务器安全防线&#xff01;一、 背景二、 升级步骤2.1 检查 OpenSSL 版本2.2 安装 OpenSSL 依赖包2.3 下载 OpenSSL 的新版本2.4 解压缩下载的文件2.5 编译并安装 OpenSSL2.5.1 切换到…

linux系统编程:网络通信

1.网络 1.粘包 tcp特点 面向连接 字节流&#xff08;TCP 将数据视为连续的字节流&#xff0c;没有明确的消息边界。会发生粘包问题。 避免粘包 特殊分隔符&#xff1a;在消息间加入特殊的分隔符&#xff08;如换行符或其他特殊字符&#xff09;&#xff0c;接收方根据分…

大模型时代的AI应用开发,可以不用,但必须会

成熟的“格子衫”和年轻的“脸庞”&#xff0c;与开发者有关的大会总是少不了这两种元素&#xff0c;Create 2024百度AI开发者大会也不例外。 过去几十年&#xff0c;层出不穷的编程语言、框架等新技术&#xff0c;把一代又一代年轻的脸庞&#xff0c;塑造为成熟的格子衫&…

技术前沿:WebRTC与H.265编码的兼容性挑战与应对策略

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种支持网页浏览器进行实时语音通话、视频聊天以及P2P文件共享的技术。然而&#xff0c;标准的WebRTC API在大多数浏览器中默认并不支持H.265&#xff08;也称为HEVC&#xff0c;高效视频编码&#xff09;编码。这…

3D打印的模具镶件性能究竟如何?

随着模具制造业的快速发展&#xff0c;3D打印技术凭借其独特优势&#xff0c;在模具随形水路设计、异形模具制造及模具排气结构优化等方面大放异彩&#xff0c;赢得了注塑、压铸等行业的广泛关注。然而&#xff0c;新技术带来的材料变革让不少人对3D打印模具的性能持观望态度—…

超全大模型训练流程,教你如何训练自己的大模型

“大模型的核心主要有两部分&#xff0c;一是训练数据&#xff0c;二是机器学习模型。” 现在大模型发展得如火如荼&#xff0c;但是没有学过人工智能技术的开发者&#xff0c;只会调用其接口&#xff0c;但不清楚怎么训练一个大模型。 今天就简单介绍一下自己的理解&#xf…

算法日记day 46(单调栈之下一个更大元素|柱状图中最大图形)

一、下一个更大元素1 题目&#xff1a; nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 &#xff0c;下标从 0 开始计数&#xff0c;其中nums1 是 nums2 的子集。 对于每个 0 …

【C语言】进程和线程详解

目录 C语言进程和线程详解1. 进程和线程的对比2. 进程的基本概念2.1 进程的定义2.2 进程的特点2.3 进程的生命周期 3. 进程管理3.1 进程创建3.2 进程间通信&#xff08;IPC&#xff09;3.2.1 管道&#xff08;Pipe&#xff09; 4. 线程的基本概念4.1 线程的定义4.2 线程的特点 …

正则表达式匹配成对括号

匹配一对括号&#xff0c;用于在一个html文本中提取JSon 文本。例如 { “duration”:7599,"minBufferTime{second bracket }{third bracket} } 一对加粗的{} &#xff0c;而不要中间的{}。简单写法会出现错误匹配。 在.Net Framework的正则表达式中&#xff0c;提供了”…

大数据-100 Spark 集群 Spark Streaming DStream转换 黑名单过滤的三种实现方式

喜大普奔&#xff01;破百了&#xff01; 点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&a…

Java框架Shiro、漏洞工具利用、复现以及流量特征分析

Shiro流量分析 前言 博客主页&#xff1a; 靶场&#xff1a;Vulfocus 漏洞威胁分析平台 Shiro&#xff08;Apache Shiro&#xff09;是一个强大且灵活的开源安全框架&#xff0c;专为Java应用程序提供安全性解决方案。它由Apache基金会开发和维护&#xff0c;广泛应用于企业级…

毛利率承压连亏三年后一季度业绩暴增,百利天恒谋求A+H双上市

《港湾商业观察》施子夫 7月10日&#xff0c;四川百利天恒药业股份有限公司&#xff08;以下简称&#xff0c;百利天恒&#xff09;递表港交所主板&#xff0c;联席保荐机构高盛、摩根大通和中信证券。 此次递表港交所系百利天恒第二次谋求上市&#xff0c;若上市成功&#x…

PyTorch升级之旅——安装与基本知识

目录 一、安装 二、张量 创建tensor 张量的操作 广播机制 三、自动求导 四、并行计算 &#xff08;一&#xff09;网络结构分布到不同的设备中(Network partitioning) &#xff08;二&#xff09;同一层的任务分布到不同数据中(Layer-wise partitioning) &#xff08;…

GoModule

GOPATH 最早的就是GOPATH构建模式&#xff0c; go get下载的包都在path中的src目录下 src目录是源代码存放目录。 package mainimport ("net/http""github.com/gorilla/mux" )func main() {r : mux.NewRouter()r.HandleFunc("/hello", func(w h…

解决使用matplotlib不显示中文的问题

某季度某城市某天11点到12点气温变化图 import random x range(60) y_BeiJing [random.uniform(15,18) for i in x] plt.figure(figsize(20,8),dpi80) plt.plot(x,y_BeiJing) x_label ["11点{}分".format(i) for i in x] plt.xticks(x[::5],x_label[::5]) plt.yt…

【精选】基于微信小程序的地铁站点查询系统(全网独一无二,阿龙原创设计)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

C# x Unity面向对象补全计划 设计模式 之 实现一个简单的有限状态机

一个简单的有限状态机可以有如下内容 1.状态基类&#xff08;定义基本状态的方法&#xff0c;如进入&#xff08;Enter&#xff09;、执行&#xff08;Execute&#xff09;和退出&#xff08;Exit&#xff09;&#xff0c;同时可以在此声明需要被管理的对象&#xff09; 2.具体…