排序算法——快速排序

快速排序是计算机科学中最著名和广泛使用的排序算法之一。自1960年由英国计算机科学家托尼·霍尔(Tony Hoare)发明以来,它以其高效率和简洁的实现而闻名。在本文中,我们将深入探讨快速排序的工作原理、其优缺点,并提供一个用C++编写的实现示例。

工作原理

快速排序是一种“分而治之”的算法。它的核心思想是选取一个元素作为“基准”(pivot),然后将数组分为两部分,使得左边的元素都比基准小,右边的元素都比基准大。这个过程称为“分区”(partitioning)。之后,算法递归地在左右两个子数组上重复这个过程,直到整个数组排序完成。

分区操作

分区是快速排序中最关键的步骤。选择一个元素作为基准值,然后对数组进行重排,使得所有小于基准值的元素都在其左侧,所有大于基准值的元素都在其右侧。基准值在这个过程中会被放置在其最终位置上。

递归排序

一旦完成分区操作,基准值就位于其最终位置。这时,可以递归地对基准值左侧和右侧的子数组执行相同的操作,直到子数组的大小缩减到1或0,这时数组就被认为是排序完成的。

实现示例(C++)

下面是一个用C++编写的快速排序的简单实现。这个实现使用了“Lomuto分区方案”,其中基准值选为子数组的最后一个元素。

#include <iostream>
#include <vector>using namespace std;void quickSort(vector<int>& arr, int low, int high) {if (low < high) {int pivot = arr[high];int i = low;for (int j = low; j < high; j++) {if (arr[j] < pivot) {swap(arr[i], arr[j]);i++;}}swap(arr[i], arr[high]);quickSort(arr, low, i - 1);quickSort(arr, i + 1, high);}
}int main() {vector<int> arr = {10, 7, 8, 9, 1, 5};quickSort(arr, 0, arr.size() - 1);for (int num : arr) {cout << num << " ";}return 0;
}

优缺点

优点

  1. 效率:在平均情况下,快速排序的时间复杂度为O(n log n),这使得它在多数情况下非常高效。
  2. 就地排序:快速排序不需要额外的存储空间,它是一种就地排序算法。
  3. 适应性:对于大型数据集,快速排序通常比其他O(n log n)复杂度的排序算法表现得更好。

缺点

  1. 最坏情况性能:在最坏情况下(如输入数组已排序或反向排序),快速排序的时间复杂度降至O(n^2)。
  2. 不稳定:快速排序不是一个稳定的排序算法,这意味着相等元素的初始顺序可能在排序后被改变。

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

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

相关文章

网络安全这条路,如何打怪升级干掉大Boss?

企业对网络安全的重视是挂在嘴上还是落实在行动中&#xff1f;网络安全人员岗位设置是否合理而有效&#xff1f;网络安全从业者最需要什么样的技能培训&#xff1f;网络安全从业者的职业发展路径应该如何规划&#xff1f;一份“网络安全从业人员现状调查”报告&#xff0c;解你…

解决Hbase报错:ERROR: Can‘t get master address from ZooKeeper; znode data == null

文章目录 问题描述解决方案 问题描述 报错了&#xff1a;这啥公司啊&#xff0c;怎么给的文档怎么错这么多&#xff0c;起一服务&#xff0c;集群里总有几个组件报错 继上次Flume 脚本&#xff0c;使用hdfs sink报错了以后&#xff0c;hbase又报错了&#xff0c;报错提示如下&…

与OA完美契合的开放式低代码平台

随着企业数字化转型的加速&#xff0c;越来越多的企业开始寻求能够快速适应业务需求变化、降低IT成本、提高运营效率的信息系统解决方案。OA作为面向企业日常办公需求的信息系统&#xff0c;在提高企业内部协作效率、优化业务流程、降低运营成本方面具有重要的作用。 它涵盖了…

山西电力市场日前价格预测【2023-12-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-12-13&#xff09;山西电力市场全天平均日前电价为331.79元/MWh。其中&#xff0c;最高日前电价为371.77元/MWh&#xff0c;预计出现在11:15。最低日前电价为280.66元/MWh&#xff0c;预计…

OpenHarmony 如何去除系统锁屏应用

前言 OpenHarmony源码版本&#xff1a;4.0release / 3.2 release 开发板&#xff1a;DAYU / rk3568 一、3.2版本去除锁屏应用 在源码根目录下&#xff1a;productdefine/common/inherit/rich.json 中删除screenlock_mgr组件的编译配置&#xff0c;在rich.json文件中搜索th…

Vue中使用echarts@4.x中国地图及AMap相关API的使用

一、此 demo 实现的基本功能 1.中国地图的显示 2.地图点击下钻的功能 3.地图相关组件的使用&#xff0c;例 tooltip… 二、实现思路 初始使用下载本地的中国 geo 格式的 json 数据来绘制地图&#xff0c;点击某一区划&#xff08;例&#xff1a;山东省&#xff09;时&#xff0…

Android13 不能静态注册的几个广播

Android13 不能静态注册的几个广播 文章目录 Android13 不能静态注册的几个广播一、不能静态注册的广播:二、静态注册无法生效的分析1、Intent.java2、其他地方声明了不能静态注册的广播3、为啥静态注册的广播无效&#xff1f;4、其他静态注册无法生效的广播5、其他Android fra…

LeeCode刷题

寻找数组的中心下标 给定一个整数nums&#xff0c;请编写一个能够返回数组“中心下标”的方法 中心下标是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标&#xff0c;返回-1.如果数组右多个中心下标&#xff0c;应该返回…

C#中UDP的简单使用+样例

发送&#xff1a; udpClient.Send(bytes, bytes.Length, "127.0.0.1", 11001); --发送的数据是byte类型&#xff0c;指定ip和端口 接收&#xff1a; public MainWindow() {InitializeComponent();udpClient new UdpClient(11001); // 监听端口11001Task.Run(() &g…

SQL Update语句

SQL Update语句 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; SQL Update语句&#xff1a;数据库操作高招解析 数据库是我们搭建查券返利机器人的重要组成部分&…

【计算机设计大赛】冬残奥会可视化系统_附源码—信息可视化赛道获奖项目深入剖析【可视化项目案例-19】

🎉🎊🎉 你的技术旅程将在这里启航! 记得看本专栏里顶置的可视化宝典导航贴哦! 🚀🚀 本专栏为可视化专栏,包含现有的所有可视化技术。订阅专栏用户在文章底部可下载对应案例完整源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你…

kafka学习笔记--节点的服役与退役

本文内容来自尚硅谷B站公开教学视频&#xff0c;仅做个人总结、学习、复习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处为尚硅谷&#xff0c;不得用于商业用途。 如有侵权、联系速删 视频教程链接&#xff1a;【尚硅谷】Kafka3.x教程&#xff08;从入门到调优…

Linux命令dmidecode查看主板型号

在 Linux 系统中&#xff0c;可以使用 dmidecode 命令来查看主板型号。dmidecode 是一个工具&#xff0c;它能够读取系统的 DMI&#xff08;Desktop Management Interface&#xff09;信息&#xff0c;包括主板型号、BIOS 版本、CPU 信息等。 要查看主板型号&#xff0c;可以按…

python程序大全(8)——鼠标乱动恶搞小病毒(有资源)

目录 &#x1f3c6;一、前言 &#x1f3c6;二、程序第一版 &#x1f3c6;三、程序大魔改 &#x1f6a9;1、基础改动 &#x1f6a9;2、打包 &#x1f6a9;3、F12保护机制 &#x1f6a9;4、添加开机自启项 &#x1f6a9;5、自己也不懂的线程魔改 &#x1f3c6;四、最终代码 &…

linux(6):linux用户和权限

在linux基础命令第五弹中http://t.csdnimg.cn/Fu5cJ我们学到了关于如何查看命令选项的帮助手册&#xff0c;到此&#xff0c;基础命令的学习先告一段落&#xff0c;我们来学习linux有关用户和权限的问题&#xff0c;这是很有必要的&#xff0c;如果任何人都可以修改我们的文件内…

数据结构 | 查漏补缺之顺式存储和链式存储、如何评价哈希函数的好坏、链地址法、树的遍历、关键路径、完全图、连通图、迪杰斯特拉、b树

目录 顺式存储和链式存储 优缺点比较 顺序存储 ​编辑 链式存储 如何评价哈希函数的好坏 简述哈希查找中链地址法解决冲突的方法 树的遍历 关键路径 完全图 连通图 迪杰斯特拉 b树 特点&#xff1a; 插入&#xff08;索引不能大于&#xff1a;最大为 M-1 个&#…

算法刷题系列:二分(一)

目录 一、糖果促销 这个算法竞赛就是个记忆大赛&#xff0c;你做不出来的题说明你没做过同类型或者同个模型的题&#xff0c;当然不是你的智商有问题&#xff0c;所以多做题很重要&#xff0c;加油&#xff01; 一、糖果促销 码题集&#xff1a;糖果促销 第一种当然是自己最开…

拼接不同文件夹中同名图片的方法

有时候为了方便对比不同文件夹中同名图片&#xff0c;需要拼接在一起&#xff0c;这里提供一个拼接方法&#xff0c;当然不同命文件也可以实现拼接&#xff0c;稍微改改就能实现 如下图&#xff0c;在文件夹中有五个文件夹中的图片需要拼接&#xff0c;拼接后的图片存放在img_…

Spark RDD的转换

按颜色区分转换&#xff1a; 绿色是单 RDD 窄依赖转换黑色是多 RDD 窄依赖转换紫色是 KV 洗牌型转换黄色是重分区转换蓝色是特例的转换 单 RDD 窄依赖转换 MapPartitionRDD 这个 RDD 在第一次分析中已经分析过。简单复述一下&#xff1a; 依赖列表&#xff1a;一个窄依赖&…

日历管理:应对金融服务行业数据调度的复杂挑战

在当今快速发展的金融服务行业中&#xff0c;数据管理和调度的复杂性日益增加。在金融服务公司面临着多元化的挑战&#xff0c;这些挑战不仅涉及技术层面&#xff0c;还包括安全、运维和业务流程的优化。 日历管理在工作流调度中看似是一个较小的功能&#xff0c;但对于许多企业…