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

news2024/9/23 21:30:15

挖坑法

挖坑法动态示意图

挖坑法方法分析

创建左右指针。⾸先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新 的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结 束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标)。注意这里用的是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.coloradmin.cn/o/2053836.html

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

相关文章

STM32——CAN通讯基础知识

CAN 协议简介 CAN 是控制器局域网络 (Controller Area Network) 的简称&#xff0c;它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的&#xff0c;并最终成为国际标准(ISO11519以及ISO11898),是国际上应用最广泛的现场总线之一。差异点如下&#xff1a; 高速CAN可以达…

关于shortlink项目重构增加了del_time字段自己出现的问题

最近刚做完shortlink项目的重构问题,其中增加del_time作为t_link表的唯一索引要注意几点问题. 1.数据库表中的del_time字段类型为什么,一定要和DO中的类型统一. 2.del_time作为唯一索引不要写死了,不然就无法创建短连接了,这里我是将del_time修改成date类型,然后通过new date…

Python数分实战

学习视频&#xff1a;【课程3.0】Python基础与分析实战_哔哩哔哩_bilibili 由于学习过python进行数据分析&#xff0c;所以就简单记录一下&#xff0c;最主要学习的还是视频最后的两个项目&#xff0c;进行实战 之前想不明白明明有很智能的软件做数据分析&#xff0c;为什么还要…

XXX【5】观察者模式

文件分割案例&#xff1a; 用户输入文件路径filePath和分割数量number&#xff0c;初始化出一个FileSplitter实例对象&#xff0c;然后调用split方法文件分割。 假如&#xff1a;我要加一个进度条的设计 抽象不能依赖于实现细节&#xff1a;在第6行的m_progressBar是一个进度通…

【深度解析】WRF-LES与PALM微尺度气象大涡模拟

查看原文>>>【深度解析】WRF-LES与PALM微尺度气象大涡模拟 针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和…

vimplus出现的错误,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

C++面向对象编程(上)

类与对象属于面向对象的程序设计思想(Object Oriented Programming)&#xff0c;简称OOP。 面向对象基础理论 面向对象是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物&#xff0c;是一种软件开发的方法 面向对象四大特性 1.抽象 忽…

数据库(五):多表设计和多表查询

项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在各种联系&#xff0c;基本上分为三种&#xff1a;一对一、多对一、一对多…

如何在寂静中用电脑找回失踪的手机?远程控制了解一下

经过一番努力&#xff0c;我终于成功地将孩子哄睡了。夜深人静&#xff0c;好不容易有了一点自己的时间&#xff0c;就想刷手机放松放松&#xff0c;顺便看看有没有重要信息。但刚才专心哄孩子去了&#xff0c;一时就忘记哄孩子之前&#xff0c;顺手把手机放哪里去了。 但找过手…

进程相关知识

进程和程序的区别 程序 程序是静态的&#xff0c;是存储在硬盘、SSD等存储介质中的一个文件&#xff0c;通常由源代码&#xff08;如 .c 文件&#xff09;编译生成的二进制可执行文件&#xff08;如 a.out&#xff09;。程序包含了指令和数据&#xff0c;但在未被执行时&#…

【计算机操作系统】基本分页存储管理

文章目录 基本分页存储管理分页存储的概念重要的数据结构——页表页表项大小计算地址转换实现 基本地址变换机构具有快表的地址变换机构快表&#xff08;TLB&#xff09;的概念引入快表后的地址变换局部性原理 两级页表单级页表 vs 两级页表 基本分页存储管理 非连续分配&#…

使用Python编写AI程序,让机器变得更智能

人工智能&#xff08;AI&#xff09;是当今科技领域最热门的话题之一。随着Python编程语言的逐渐流行&#xff0c;它已经成为许多人工智能编程的首选语言。本文将介绍如何使用Python编写AI程序&#xff0c;让机器变得更智能。 首先&#xff0c;Python提供了大量的AI库和工具&a…

Easysearch 性能测试方法概要

&#xff08;公众号用的是QQ音乐&#xff0c;可以随时听&#xff09; INFINI Easysearch INFINI Easysearch 是一个分布式的近实时搜索与分析引擎&#xff0c;核心引擎基于开源的 Apache Lucene。Easysearch 衍生自基于开源协议Apache 2.0 的Elasticsearch 7.10 版本&#xff0…

4-1-2 直流电机(电机专项教程)

4-1-2 直流电机&#xff08;电机专项教程&#xff09; 4-1-2 直流电机主要参数尺寸参数额定电压额定电流空载转速 如何控制直流电机有刷直流电机转向控制H桥电路控制转向 如何控制电机转速PWM控制电机转速 4-1-2 直流电机 之前学习了有刷直流电机的基本结构个工作原理&#xff…

[数据集][图像分类]电力场景电力线固定处连接处腐蚀有鸟巢分类数据集1279张3类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1279 分类类别数&#xff1a;3 类别名称:["corrosion","nes…

SparkSQL遵循ANSI标准

ANSI简介 ANSI Compliance通常指的是遵循美国国家标准学会&#xff08;American National Standards Institute, ANSI&#xff09;制定的标准。在计算机科学和技术领域&#xff0c;这通常涉及到数据库管理系统&#xff08;DBMS&#xff09;对于SQL语言的支持程度。 ANSI为SQL…

FreeRTOS 快速入门(二)之内存管理

目录 一、概述二、FreeRTOS 中管理内存的 5 种方法1、Heap_12、Heap_23、Heap_34、Heap_44.1 内存申请4.2 内存释放 5、Heap_5 三、Heap 相关的函数1、pvPortMalloc/vPortFree2、xPortGetFreeHeapSize3、xPortGetMinimumEverFreeHeapSize4、malloc 失败的钩子函数 一、概述 在…

CDGA|数据治理,就像在厨房里炒一盘好菜

数据治理&#xff0c;就像在厨房里炒一盘好菜&#xff0c;是一门既讲究技巧又注重细节的艺术。在这个信息爆炸的时代&#xff0c;数据如同食材&#xff0c;是支撑企业决策、优化运营、驱动创新的基石。而数据治理&#xff0c;则是将这些纷繁复杂的数据“食材”精心挑选、清洗、…

使用NPS搭建socks5隧道 | 内网穿透

在看春秋云镜靶场的WP时碰到用NPS来做代理的&#xff0c;这里刚好看到这篇文章&#xff1a;https://www.cnblogs.com/cute-puli/p/15508251.html&#xff0c;学习一下。 GUI界面管理更加方便。 实验环境 网络拓扑&#xff1a; kali&#xff1a; VMnet1&#xff08;公网&…

ORB-SLAM3演示及运行

ORB-SLAM安装完成后的运行案例 ros启动 1、修改双目部分文件&#xff0c;主要是图象订阅话题名称 因为我是用的双目灰度相机&#xff0c;需要修改ORB_SLAM3/Examples/ROS/ORB_SLAM3/src下的 ros_stereo.cc和 ros_stereo_intertial.cc. 把订阅的话题改为自己系统发布的图象…