数据结构(8.3_2)——快速排序

devtools/2024/10/22 10:13:24/

算法思想:

设置两个指针,一个i指针初值为low和一个j指针初值为high,j指针从左往右移,当j指向的元素小于枢轴元素将该元素放到枢轴元素左边,i指针从右往左移,当i指向的元素大于枢轴元素,将该元素放到枢轴元素右边 

 

从上图可知49已经排序完,并且将左右两边分为了两个子表,接下来再对两个子表进行快速排序 

左子表:

 

右子表:

接下来的步骤继续将76划分为左右两个子表,继续进行快速排序

代码实现(重点) 

//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[], int low, int high) {int pivot = A[low];//第一个元素作为枢轴while (low < high) {//用low、high搜索枢轴的最终位置while (low < high && A[high] >= pivot)--high;A[low] = A[high];//比枢轴小的元素移动到左端while (low < high && A[low] <= pivot)++low;A[high] = A[low];//比枢轴大的元素移动到右端}A[low] = pivot;//枢轴元素存放到最终位置return low;//返回存放枢轴的最终位置
}//快速排序
void QuickSort(int A[], int low, int high) {if (low < high) {//递归跳出的条件int pivotpos = Partition(A, low, high);//划分QuickSort(A, low, pivotpos - 1);//划分左子表QuickSort(A, pivotpos + 1, high);//划分右子表}
}

代码解释:

首先需要一个递归调用栈

 

进入第一层的QuickSort函数,传入数据和划分左右子表,low=0,high=7,#96表示代码执行的行数是在第96行:

第一层划分结果,传出low的值是3,第一层的pivotpos=3;

 

接下来划分左子表,进入第二层的QuickSort函数,low=0,high=pivotpos-1,此时第一层还压在栈中

划分完后第二层pivotpos=1,接下来开始划分左子表的左子表,进入第三层QuickSort函数,low=0,high=pivotpos-1;

 

 

 

划分完左子表的左子表后,因为第三层的low=high,所以退回第二层,接下来进行第二层的划分右子表,进入第三层QuickSort,low=pivotpos+1,high=2;

因为low=high,所以无需处理数据,直接返回第二层QuickSort函数

接下来返回第一层QuickSort函数,开始运行划分右子表代码,进入第二层QuickSort函数,low=4,high=7;

在第二层中处理完后返回low值为6,得到第二层的pivotpos=6,开始进行第二层划分左子表,low=4,high=5

在第三层中调用QuickSort函数,进入第四层,得出第三层pivotpos=4,同时因为low=high退出第四层,返回第三层;

在第三层开始执行划分左子表操作,low=4,high=pivotpos-1,进入第四层QuickSort

因为low>high,所以返回第三层,开始执行划分右子表操作,low=pivotpos+1,high=5

因为low=high,所以返回第三层,因为第三层代码执行完毕,返回第二层,开始执行划分右子表操作,low=pivotpos+1,high=7

因为low=high,所以返回第二层,又因为第二层代码执行完毕,所以返回第一层,第一层代码也已经执行完毕,递归结束;

算法效率分析

时间复杂度=O(n*递归层数)

Partition函数时间复杂度:O(n)

 

 

空间复杂度=O(递归层数) 

平均时间复杂度:O(nlog_2n) 

比较好的情况:

 

最坏的情况:

 

优化思路:

 

 

 

递归层数(转换为二叉树的高度进行判断) 

快速排序算法的稳定性:

不稳定

 

 

总结:

 


http://www.ppmy.cn/devtools/127799.html

相关文章

笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些

一、目的&#xff1a;WPF中MarkupExtension使用的IServiceProvider参数都有哪些&#xff0c;都是做什么的 在 WPF 中&#xff0c;MarkupExtension 类的 ProvideValue 方法接受一个 IServiceProvider 参数。IServiceProvider 是一个服务定位器接口&#xff0c;允许你在运行时获取…

高级sql技巧

以下是一些高级 SQL 技巧: 一、窗口函数 窗口函数可以在不影响数据分组的情况下,对数据进行排序、聚合等操作,非常强大。 排名函数 ROW_NUMBER():为每一行分配一个唯一的连续整数序号。RANK():计算排序值,如果有相同的值会出现并列排名,并且下一个排名会跳过相应的数量…

新一代Linux防火墙已经来临(iptables面临淘汰)

本文全面的介绍了iptables和nftables这两个Linux防火墙工具的基本概念及其主要区别&#xff0c;并给出了选择哪一个工具的建议。 iptables是较早版本的Linux防火墙工具&#xff0c;它已经广泛应用于各种Linux发行版中。iptables的优点在于其广泛的文档支持和社区经验积累&…

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问&#xff08;Batch Key Access, BKA&#xff09; 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术&#xff0c;特别是在通过索引进行 JOIN 时&#xff0c;它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…

自适应权重

自适应权重&#xff08;adaptive weights&#xff09;是一种动态调整权重的策略&#xff0c;广泛应用于深度学习和机器学习的不同领域。这种策略的核心思想是&#xff0c;在模型训练或推理过程中&#xff0c;根据输入数据、模型状态或任务需求来调整各个部分的权重&#xff0c;…

Web,RESTful API 在微服务中的作用是什么?

大家好&#xff0c;我是锋哥。今天分享关于【Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Web&#xff0c;RESTful API 在微服务中的作用是什么&#xff1f; 在微服务架构中&#xff0c;Web 和 RESTful …

简单三步完成 Telegram 生态的 Web3 冷启动

在竞争激烈的 Web3 领域&#xff0c;强有力的启动往往能决定成败。Telegram 无疑当下最火热的流量池&#xff0c;是很多 Web3 项目冷启动阶段的必选项。 但眼看着好多项目在 Telegram 生态火速获取百万级甚至千万级别的用户&#xff0c;自己的项目要怎么开始做增长&#xff0c;…

比XML更简洁的配置文件——yml(2min了解)

对于计算机应用开发技术&#xff0c;这条路的方向总是化繁为简的。或许有一天&#xff0c;微机课上的小学生&#xff0c;正玩着拼图游戏来开发一款App…… 在Java Web开发中&#xff0c;XML&#xff08;可扩展标记语言&#xff09;和YAML&#xff08;YAML Aint Markup Language…