第三章 :查找与排序-------3.6快排在工程实践中的优化

七种排序算法详解:从冒泡到快排,复杂度、稳定性与工程优化 排序算法是数据结构与算法体系中的基础能力,也是数据库查询、排行榜、订单列表等互联网场景的高频操作。理解排序,离不开时间复杂度和空间复杂度的对比,更离不开稳定性这一关键属性——稳定排序能保留相同元素的相对次序,是多关键字排序、增量排序的工程基础。从冒泡排序、插入排序到快速排序、归并排序与堆排序,七种经典算法覆盖了 O(n²) 到 O(n log n) 的主要性能档位,也展现了分治、堆化、递归等核心编程思想。生产环境中的排序实现往往不会直接使用教科书版本,而是通过三值取中、插入阈值、三路切分与内省机制进行优化, 阅读详情

未优化的快速排序:

T(n)=2T(n/2)+O(n)。

算法时间复杂度:O(nlgn)。


当主元没选好:(最大/最小):

时间复杂度: O(n²)。


三点中值法:

优化: 在p、r、mid之间,选一个中间值作为主元

#include<iostream>
using namespace std;
 
//三点中值法 
int partition(int A[],int p,int r){
	
	//优化: 在p、r、mid之间,选一个中间值作为主元
	int midIndex=p+((r-p)>>1); //中间下标
	int midValueIndex=-1; //中值的下标
	if(A[p]<=A[midIndex]&&A[p]>=A[r]){
		midValueIndex=p;
	} 
	else if(A[r]<=A[midIndex]&&A[r]>=A[p]){
		midValueIndex=r;
	} 
	 else{
	 	midValueIndex=midIndex;
	 }
	swap(A[p],A[midValueIndex]);
	int pivot=A[p];
	
	int left=p+1;//扫描指针 
	int right=r; //右侧指针 

	
	while(left<=right){
		//left不停往右走,直到遇到大于主元的元素
		while(A[left]<=pivot) left++;   //循环退出时,left一定是指向第一个大于主元的位置 
		while(A[right]>pivot) right--;   //循环退出时,right一定是指向最后一个小于等于主元的位置 
		if(left<right){
			swap(A[right],A[left]);	
		}			
	} 
	//while退出时,两者交错,且right指向的是最后一个小于等于主元的位置,也就是主元应该待的位置 
	swap(A[p],A[right]);
	
	return right;		
}
 
void quickSort(int A[],int p, int r){
	if(p<r){
		int q=partition(A,p,r);
		quickSort(A,p,q-1);
		quickSort(A,q+1,r); 
	}
} 
 
int main(){
	int arr[]={1,6,2,3,4,8,11,3,9,4,2,5,3};
	quickSort(arr,0,12);
	for(int i=0;i<13;i++){
		cout<<arr[i]<<" ";
	}
 
	return 0;
}

结果:


绝对中值法:

//获取绝对的中值数,,O(N)的样子
int getMedian(int arr[],int p,int r){   //p:首下标; r:最后一个下标 
	int size=r-p+1; //数组长度
	
	//每五个元素一组, groupSize:组数 
	int groupSize=(size%5==0)?(size/5):(size/5+1);
	
	//存储各小组的中值
	int medians[groupSize];
	
	int indexOfMedians=0;  //中值数组medians 的下标 
	
	//对每一组进行插入排序
	for(int j=0;j<groupSize;j++){
		//单独处理最后一组,因为最后一组可能不满5个元素 
		if(j=groupSize-1){
			insertionSort(arr , low: p+j*5 , high: r); //对最后一组进行插入排序 
			medians[indexOfMedians++]=arr[(p+j*5+r)/2]; //最后一组的中间的那个元素 
		}
		else{
			insertionSort(arr , low: p+j*5 , high: p+j*5+4);//对非最后一组进行插入排序
			medians[indexOfMedians++]=arr[p+j*5+2]; //当前组(排序后)的中间的那个 
		} 
	} 
	//对medians排序
	insertSort(medians,0,medians.length-1); //PS: C++对数组不能用 数组.length(), 对string可以 
	return medians[medians.length/2]; 
} 

求出中值后,只需和第一个元素交换,后面代码相同。


待排序列表较短时,用插入排序

PS:n<=8; 插入排序( O(n(n-1)/2) )比快速排序( O(2n(lgn+1)) )要快。

n<=8, 插入排序;  否则,快速排序。

阿里平头哥与华为芯片的比较 阿里平头哥与华为芯片代表了中国AI芯片领域的两种典型发展路径:平头哥通过兼容CUDA生态快速切入市场,以较低成本提供接近国际水平的AI算力;华为则坚持全栈自研路线,构建从芯片到框架的完整技术体系,更注重供应链安全和自主可控。从短期来看,平头哥PPU在单卡性能参数上全面超越昇腾910B,接近英伟达H20水平,且成本优势明显,有望在云服务和互联网应用领域取得更大市场份额。而华为昇腾则凭借全栈自研和端边云协同优势,在政企市场和科研领域更具竞争力。 阅读详情

相关推荐

状态错误CS0234命名空间“Windows”中不存在类型或命名空间名“Management”(是否缺少程序集引用?)

解决源码编译UE打包失败问题

五百零一 2338

快排在工程实践中的优化《算法很美》

快排在工程实践中的优化 思路:优化,在p,r,mid之间,选一个中间值作为主元 public class 快排在工程实践中的优化 { public static void main(String[] agrs){ int[] arr = {9,3,4,8,7,6,4,2,9,10}; quickSort2(arr, 0, arr.length-1); Util.print(arr); } public static void qu

罗彬桦的博客 207

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 459

快速排序在工程实践中的优化

1、三点中值法 三点中值法就是双向扫描的优化,降低算法复杂度。主要区别是把begin,end,mid进行比较,把中间值作为目标值进行比较排序。 public static void main(String[] args) { // TODO Auto-generated method stub int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8,...

qq_41477266的博客 163

用STM32的SPI模式2搞定SSI绝对值编码器通信(附完整代码与避坑点)

本文详细解析了如何使用STM32的SPI模式2实现SSI绝对值编码器通信,包括硬件设计、SPI配置、数据处理算法及稳定性优化技巧。通过完整的代码示例和避坑指南,帮助工程师解决时序匹配、数据解析等常见问题,提升工业自动化系统中的编码器通信可靠性。

weixin_27252001的博客 269

【机器人】转动的指数坐标表示心得理解

转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需

要恰饭得嘛 2329

排序与查找算法全解析:原理、实现与优化

系统梳理常见排序与查找算法的原理、实现、性能分析、工程优化与AI场景应用,结合面试高频题型、实战案例、常见陷阱、工程实践与前沿发展,助力算法面试与大数据/AI工程落地。掌握主流排序与查找算法原理、实现与性能分析注重工程优化与AI/大数据场景下的应用面试与实战并重,关注常见陷阱与前沿发展持续学习新型排序/查找技术,关注未来趋势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 688

本地AI语音生成与配音工作台Pandrator:从TTS到RVC的完整实践指南

语音合成(TTS)技术通过深度学习模型将文本转换为自然语音,其核心原理涉及声学建模与波形生成。这项技术不仅提升了人机交互体验,更在内容创作领域展现出巨大价值,广泛应用于有声书制作、视频配音、虚拟助手等场景。本文聚焦于一个集成了XTTS-v2、RVC等先进模型的本地化AI语音工作台——Pandrator,它通过模块化架构将语音合成、声音克隆、音频转录与翻译等流程无缝整合,为用户提供了一个图形化、可定制的完整解决方案。文章深入解析了其基于TTS与RVC(Retrieval-based Voice Convers

weixin_42676876的博客 340

排序与查找算法实战:从基础到工程优化

排序与查找算法是计算机科学的核心基础,直接影响系统性能与用户体验。时间复杂度从O(n²)到O(n log n)的演进,揭示了算法效率的本质差异。通过合理选型(如快速排序、归并排序)和工程优化(如三数取中法、尾递归消除),能在电商、金融等场景实现百倍性能提升。现代分布式系统结合MapReduce与归并排序处理海量数据,而哈希查找与跳表等结构在Redis等高并发场景表现优异。实测表明,混合使用布隆过滤器和B+树等策略,可降低87%磁盘IO。理解这些算法的底层原理与实现细节,是构建高性能系统的关键。

weixin_32612263的博客 242

电源管理芯片PMIC

(Power Management Integrated Circuits,简称:将电源电压转换为电子设备各部分所需的适当电压水平,包括升压(Boost)、降压(Buck)和升降压(Buck-Boost)转换。:控制和限制流向电子设备各部分的电流,以保护组件免受过电流损害。:管理多个电源轨,为不同的部分提供稳定的电能控制。电源轨指电路板上传输电力的线路。电源监控:提供过电压、欠电压、过电流、过热和短路保护,以防止电子设备损坏。:通过高效的电源转换技术,减少能量损耗,提高能源利用效率。

qq_42786033的博客 1万+

《一》:LBE,VR 大空间系列——场景环境需求解析

当前,大量 VR 体验活动在室内场地开展。因此,对于场地照明有特定要求:除天花板外,场地的所有表面均需有照明覆盖。这是为了保证玩家无论处于场地的哪个位置,地面与墙面都不会出现明显的影子。场地内不建议安装射灯或高强度的点光源,若已安装此类灯具,需使用柔光板进行遮盖。此外,要避免在阳光下使用 VR 设备台。参考图(请忽略其中Maker标签)

unitygroup的博客 944

快排与二分查找组合实战:从原理到工程应用的高效查询方案

在数据处理与算法优化中,快速排序和二分查找是两种基础且高效的算法思想。快速排序通过分治策略将无序数据变为有序序列,而二分查找则依赖有序结构实现O(log n)级别的快速检索。两者结合,形成了从数据预处理到高频查询的完整解决方案,广泛应用于黑名单校验、区间统计、两数之和等场景。理解它们的底层原理与边界条件,不仅能提升代码性能,还能在面试与工程实践中游刃有余。本文从工程与面试双重视角,拆解手写快排的细节、二分查找的区间收敛逻辑,并通过实际案例展示组合使用的性能优势与注意事项,帮助开发者真正掌握这一高效查询方法论

weixin_33824385的博客 201

BES 平台 SDK之 美格信Dongle 连接

最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。

谢文浩博客 927

排序与查找算法工程选型:从二分、哈希到Top K与外部排序

排序算法与查找算法是数据处理的基础骨架,核心原理是用预处理换取查询效率:排序把数据变得有序,二分查找才能在对数时间内定位区间;哈希表则以空间和哈希分布换取期望O(1)查找。真正影响性能的不只是时间复杂度,还包括数据规模、重复值、稳定性、缓存访问模式与存储介质。合理选型可支撑日志时间窗口检索、排行榜Top K、订单号区间查询、标签去重、集合求交和游标分页等场景,避免全表扫描与排序退化。工程落地还需关注二分边界、哈希负载因子、堆方向、外部排序块大小与多关键字排序顺序,并结合基准测试做参数调优。

weixin_31099291的博客 236

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

查找与排序:程序员内功的核心算法详解与工程实践

算法与数据结构是编程的基石,而查找与排序是工程中最常用的两类算法。时间复杂度决定了算法在大数据量下的表现,稳定性则影响多字段排序的正确性。从顺序查找到二分查找,从冒泡排序到快速排序、归并排序,每种算法都有其适用场景与代价。哈希查找将时间优化到常数级别,但需权衡空间与冲突处理。工程实践中,标准库往往采用混合策略,如内省排序,说明没有万能算法,只有最合适的组合。结合成绩管理系统的实例,展示如何设计查找与排序流程,并规避边界条件、稳定性、递归深度等常见坑。掌握这些基础,能真正提升程序性能与健壮性。

weixin_32822843的博客 290

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【数据结构与算法-Day 43】深入剖析快速排序(下):随机化、三路快排与工程应用

标准的快速排序并非完美,它在特定输入下存在性能瓶颈,甚至会退化到与冒泡排序相当的效率。本文将作为快速排序的进阶篇,深入探讨其性能软肋,并引入两种至关重要的优化策略:**随机化 Pivot** 和 **三路快排**。我们将通过图解、代码和场景分析,彻底搞懂如何让快速排序在各种情况下都能保持“快”的本色,并最终探讨其在工程实践中的地位和选择。

吴师兄大模型的博客 1956

基础算法精要解析:从排序到查找的工程实践

算法是计算机科学的核心基础,理解其原理对提升编程能力至关重要。排序与查找作为最经典的算法类型,体现了分治、递归等核心思想。通过时间复杂度分析(如大O表示法)和空间复杂度权衡,开发者可以针对不同场景选择最优算法。在实际工程中,算法优化需要考虑缓存局部性、数据特征等现实因素。例如冒泡排序通过提前终止优化可提升50%性能,快速排序结合插入排序的混合策略能更好处理小规模数据。哈希表的链地址法与开放寻址法对比展示了内存与效率的取舍。这些基础算法不仅是面试常考点,更是构建分布式系统、数据库索引等复杂技术的基石。

weixin_31766003的博客 301

数组快排与链表归并:高性能排序算法实战解析

排序算法是计算机科学中的基础核心,其中快速排序和归并排序因其O(n log n)的时间复杂度成为工程实践中的首选。快速排序通过分治策略和原地交换特性,特别适合处理内存连续的数组结构;而归并排序凭借稳定性和对链表的天然适配,在需要保持元素原始顺序或处理非连续存储时展现优势。这两种算法在大数据处理、高性能计算等领域有广泛应用,例如千万级用户行为分析采用快排可提升10倍性能,而社交网络关系链处理使用链表归并能避免内存重分配开销。理解其分区策略、递归优化等核心原理,结合三路快排、迭代式归并等进阶技巧,能有效解决实际

weixin_29758911的博客 300

插入排序的工程价值:哨兵优化、折半查找与链表适配

插入排序是一种自适应、稳定且原地的比较排序算法,其时间复杂度在近似有序数据下可降至O(n),核心优势在于低常数开销、确定性延迟和硬件友好性。它并非理论摆设,而是Linux内核小数组排序、Python timsort子模块、Redis跳表节点维护等关键场景的底层支撑。通过哨兵优化可消除边界检查带来的分支预测失败,折半查找优化能降低比较次数但需权衡移动成本,而链表适配则彻底规避结构体移动开销。这些优化路径直指嵌入式、高频交易与实时系统中‘小数据+低延迟+高确定性’的刚性需求。

weixin_29266749的博客 296

查找与排序算法实战优化指南

查找和排序算法是计算机科学的基础核心,理解其原理对提升编程效率至关重要。顺序查找适合小数据量,时间复杂度O(n);而二分查找利用有序数据特性,将效率提升至O(log n)。工程实践中,算法选择需权衡时间复杂度、空间复杂度与数据特性。例如,快速排序平均O(n log n)但不稳定,TimSort则结合归并与插入排序优势。优化技巧包括JVM字节码优化、防止整数溢出、合理选择pivot等。在Java中,Arrays.sort()针对不同数据类型智能选择算法,而Lambda表达式可简化比较器实现但需注意性能开销。

weixin_30702441的博客 61

洛谷排序算法实战:从冒泡到快排的工程优化

排序算法是计算机科学基础核心,通过元素比较与交换实现数据有序化。常见算法如冒泡排序、选择排序和插入排序,时间复杂度均为O(n²),适用于小规模数据;而快速排序等分治算法可达O(nlogn)效率。在工程实践中,算法选择需综合考量数据规模、内存限制和稳定性需求,例如插入排序适合近乎有序数据,选择排序在嵌入式系统中表现优异。洛谷平台的算法训练题目如P1177快速排序模板,能帮助开发者掌握边界条件处理和递归优化等关键技术。实测数据显示,当n<1000时优化后的选择排序比冒泡快15%,而STL sort在1e5规模数

weixin_33391446的博客 283

排序算法大全:从冒泡到快排,LeetCode排序题高效解法

排序算法是数据结构与算法的基础,也是LeetCode等编程面试中的高频考点。本文将系统介绍常见排序算法的核心原理、适用场景及在LeetCode中的实战应用,帮助你快速掌握从基础到高级的排序技巧,轻松应对各类算法题。 ## 一、排序算法全景图:类型与复杂度对比 排序算法主要分为比较类排序和非比较类排序两大类。比较类排序通过比较元素间的大小来决定顺序,而非比较类排序则利用数学特性直接确定元素位置。

gitblog_00566的博客 602

Java基础23-Java 数组进阶:数组排序算法对比(冒泡 / 快排 / Arrays.sort)

摘要: 本文深入探讨Java中三种数组排序方法:冒泡排序、快速排序和Arrays.sort(),分析其原理、实现及性能差异。冒泡排序简单但效率低(O(n²)),适合学习;快速排序采用分治思想,平均性能优异(O(n log n));而Arrays.sort()是JDK优化后的工业级实现,综合性能最佳。文章通过代码示例、复杂度对比和应用场景,帮助开发者根据需求选择合适算法,避免常见误区,提升程序效率。 (字数:148)

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

快速排序从原理到工程优化:分治、递归与稳定性全解析

排序算法是计算机科学的基础,而分治思想则是许多高效算法的灵魂。快速排序通过选取基准值将数组划分为独立子区间,再递归处理,在平均情况下达到 O(nlogn) 的时间复杂度,是理解递归与复杂度分析的经典案例。其原地排序特性带来更优的空间利用,但基准值选择策略会直接影响性能,不当选择可能导致退化到 O(n²),因此工程实现常借助随机化、三数取中等手段规避风险。实际应用中,标准库排序往往融合内省排序、双轴快排、三路快排等混合策略,以适应有序、重复元素等多样数据形态。本文从基础原理出发,逐步深入到迭代实现、性能调优与

weixin_32183107的博客 292

C++快速排序全解析:分治思想、三种分区写法与工程级优化

排序算法是计算机科学中最基础也最常用的算法之一,无论是数据去重、二分查找还是日志分析,都离不开高效的有序数据支持。在众多排序算法中,快速排序凭借其平均O(nlogn)的时间复杂度、原地排序特性和友好的缓存访问,成为工程实践中的默认选择。快速排序的核心思想是分治法:通过选取基准元素将待排序区间划分为左右两部分,使基准元素落在最终位置,再递归处理子区间。合理选择pivot、使用Hoare或三路分区等策略能有效避免有序数据或重复数据导致的性能退化。本文深入剖析快速排序的三种partition写法、复杂度演化过程,

weixin_31188927的博客 252
上一篇: 第三章 :查找与排序-------3.5快排之三指针分区法
下一篇: 第三章 :查找与排序-------3.7分治模式的完美诠释_归并排序
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值