数据结构——快速排序

基本思想:


快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
 

常见的快速排序:

// 假设按照升序对array数组中[left, right)区间中的元素进行排序
void QuickSort(int array[], int left, int right)
{
if(right - left <= 1)
return;
// 按照基准值对array数组的 [left, right)区间中的元素进行划分
int div = partion(array, left, right);
// 划分成功后以div为边界形成了左右两部分 [left, div) 和 [div+1, right)
// 递归排[left, div)
QuickSort(array, left, div);
// 递归排[div+1, right)
QuickSort(array, div+1, right);
}

上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,大家在写递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。
将区间按照基准值划分为左右两半部分的常见方式有:

1.hoare版本

 

 

 

 

代码实现: 

void Swap(int* p1, int* p2)
{int temp = 0;temp = *p1;*p1 = *p2;*p2 = temp;
}
//hoare
//[left,right]
int PartSort(int* a, int left, int right)
{int keyi = left;while (left < right){//右边找小while (left < right && a[right] >= a[keyi]){right--;}//左边找大while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);return left;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end){return;}int keyi = PartSort(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

这时候有人会问了:“为什么left的起点是keyi的位置?” 

这时候我们就得考虑我们的极端场景了。

假如我们的key是0,left的起点在key的后面

 

 

那么我们的right始终找不到比key小的,最后和left相遇了。

 那么最终排出来的顺序是错误的,1怎么可能比0小?

注意事项: 

2.挖坑法 

Hoare大佬的方法很好,奠定了我们快排的基础思想,但是,里面的坑实在是很多,稍有不慎算法就容易出错,后人因此提出了疑问并且继续优化了快速排序的代码,例如挖坑法。

首先将我们的key的值存放起来,然后讲key值所在的位置挖空。

挖坑法的单趟排序跟Hoare版的可能大差不差,但是挖坑法会相比于Hoare版本更好理解。 

代码实现:

//挖坑法
// [left, right]
int PartSort(int* a, int left, int right)
{int key = a[left];int hole = left;while (left < right){// 右边找小while (left < right && a[right] >= key){right--;}a[hole] = a[right];hole = right;// 左边找大while (left < right && a[left] <= key){left++;}a[hole] = a[left];hole = left;}a[hole] = key;return hole;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end){return;}int keyi = PartSort(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

 

3.前后针法

 

 

代码实现: 

// 前后指针法
// [left, right]
int PartSort(int* a, int left, int right)
{int prev = left;int cur = left + 1;int keyi = left;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur){Swap(&a[prev], &a[cur]);}cur++;}Swap(&a[prev], &a[keyi]);keyi = prev;return keyi;
}
void QuickSort(int* a, int begin, int end)
{if (begin >= end){return;}int keyi = PartSort(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);
}

快速排序的特性总结:


1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
2. 时间复杂度:O(N*logN)

 

3. 空间复杂度:O(logN)
4. 稳定性:不稳定

PS:大部分语言自带的库函数sort都是以快速排序为底层,快速排序虽然好但是在某些极端场景下不如插入排序,所以还是得分析需求再使用合理的排序,以免增加时间复杂度和空间复杂度。

PS:看到这里了,码字不易,给个一键三连鼓励一下吧!有不足或者错误之处欢迎在评论区指出!  

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

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

相关文章

IT服务台的优势

我们谈谈IT服务台的一些好处&#xff0c;以更好地了解其重要性。IT 服务台为所有利益相关者&#xff08;技术人员和最终用户&#xff09;提供服务带来了效率。例如&#xff0c;三层 IT 服务台可以在第 0 层拥有自助服务门户&#xff0c;在第 1、2 和 3 层拥有技术人员&#xff…

1_1. Linux简介

1_1. Linux简介 文章目录 1_1. Linux简介1. 我们用linux来干嘛2. 计算机组成3. 操作系统4. Linux哲学思想5. Linux目录6. Linux分区类型 1. 我们用linux来干嘛 1. 大家都知道linux是一个操作系统&#xff0c;它是一个基础的软件&#xff0c;操作系统是硬件与应用程序的中间层。…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

weditor安装的时候产生的问题

先放出来github的地址https://github.com/alibaba/web-editor&#xff0c;这个上面给了两种安装方式一种是&#xff1a; pip3 install -U weditor 这种方式会报错误&#xff0c; 具体原因我也不知道。那就采用第二种方式 git clone https://github.com/openatx/weditor pip3…

mysql执行流程

MySQL 架构与SQL执行流程 MySQL主要而分为server层和存储引擎层两部分 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函数等&#xff09;&#…

AI宝库:全球精选AI工具网站一网打尽,创新智慧触手可及

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 精选专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探秘AI之巅&#xff0c;一键解锁未来工具&#xff01;立即点击&#xff0c;开启智能新纪元&#…

天猫最热销的三款随身WiFi,哪一款直播最好用?2024公认最好的随身WiFi,天猫上的随身wifi是正规产品吗

近期有小伙伴问我&#xff1a;“小编、小编我要当户外博主了&#xff0c;想买一个随身WiFi&#xff0c;但是天猫榜单前三的随身WiFi自己都没有听说过&#xff0c;到底入手哪个比较好&#xff1f;”三款随身WiFi呢&#xff0c;分别是格行随身WiFi、迅优随身WiFi、小米随身WiFi&a…

2024年电工杯数学建模B题思路 中国电机工程学会杯建模思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

6 7 8 9 11 12 15 17 18 20 22cm散热风扇防护网风扇金属网罩

品牌&#xff1a;威驰 颜色分类&#xff1a;60mm/6cm金属网,80mm/8cm金属网,92mm/9.2cm金属网,110mm/11cm金属网,120mm/12cm金属网,150mm/15cm金属网,172mm/17.2cm金属网,200mm/20cm金属网,280mm/28cm金属网 1产品参数&#xff0c;防护网罩60 80 90 110 120 125 145 150 180…

Python专题:八、列表(2)

Python的内置数据类型——列表 定义一个列表a&#xff0c;直接遍历&#xff0c;列表元素 for in循环&#xff0c;通过索引遍历列表 range&#xff08;参数一&#xff0c;参数二&#xff09; range&#xff08;len(a)&#xff09;range(0,len(a)) in 关键字判断元素是否在列表…

Debian12 Linux lsof 查询端口 并杀进程 sh文件编写过程记录

目录 一、需求描述 二、需求处理思路 1、根据关键字查询进程号 2、根据端口查询进程号 3、根据进程号杀进程 三、编写shell 脚本 总结 一、需求描述 在linux环境上&#xff0c;已知某个进程的运行关键字以及运行端口&#xff0c;要求根据已知信息查杀对应进程。要求编写…

Codigger:Vim的革新者,提升开发体验和功能性

深知Vim在编程和文本编辑领域的卓越地位&#xff0c;因此&#xff0c;在设计和开发过程中&#xff0c;Codigger始终将保留Vim的核心功能和高度定制能力作为首要任务。然而&#xff0c;Vim的复杂性和高度定制性也让很多新用户望而却步。为了降低这种使用门槛&#xff0c;Codigge…

Python起风了钢琴曲

写在前面 那年夏天&#xff0c;有《纸短情长》&#xff0c;有《稻香》&#xff0c;有《可不可以》&#xff0c;有《体面》&#xff0c;还有《起风了》……本期小编给大家分享Python弹奏的《起风了》钢琴曲&#xff0c;一起来看看吧&#xff01; 《起风了》 《起风了》是一首深…

【工具篇】-Powershell

什么是powershell&#xff1f; Windows PowerShell 是一种命令行外壳程序和脚本环境&#xff0c;使命令行用户和脚本编写者可以利用 .NET Framework 的强大功能。本文来介绍一下它的打开方法和常用的命令 什么是“.NET”&#xff1f; 什么是".NET"&#xff1f;htt…

2. 感知机算法和简单 Python 实现

目录 1. 感知机介绍 1.1 背景 1.2 定义 1.2.1 权重 1.2.2 阈值 1.2.3 偏置 1.3 逻辑处理&#xff1a;与门、非门、或门 2. 感知机实现 2.1 与门的 Python 实现 2.2 非门的 Python 实现 2.3 或门的 Python 实现 1. 感知机介绍 1.1 背景 感知机1957年由 Rosenblatt 提…

09 - 函数调用

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 函数定义及调用1.1 自定义函数的语法1.2 make 解释器中的预定义函数1.2.1 预定义函数的调用1.2.2 问题1.2.3 本质分析 2. 示例代码 1. 函数定义及调用 makefile 中支持函数的概念 make 解释器提供了一系列的函数供 makefile 调…

资深测试必备技能!TestNG自动化测试框架实战详解

1、TestNG导言 在软件测试工作中&#xff0c;自动测试框架是不可或缺的&#xff0c;之前有Junit和Nunit框架&#xff0c;后有TestNG。TestNG不但吸取了Junit和Nunit框架的思想&#xff0c;而且创造了更强大的功能&#xff0c;它不但是单元测试框架&#xff0c;同时也是集成自动…

Nginx反向代理配置

一、介绍 Nginx 的反向代理功能在现代网络架构中扮演着至关重要的角色。首先&#xff0c;它充当了客户端与后端服务器之间的中介。当客户端发送请求时&#xff0c;这些请求先到达 Nginx 服务器&#xff0c;Nginx 会根据预先设定的规则和配置&#xff0c;将请求准确地转发到相应…

Linux下安装mysql8.0(以rpm包安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以rpm包安装&#xff09;https://myweb.myskillstree.cn/125.html 目录 1、查操作系统信息 2、下载mysql 8.0.34的rpm包 …

【Anaconda 3 】Jupyter Notebook 的安装配置及使用

Jupyter Notebook 的安装配置及使用 一、引言 Jupyter Notebook 是一种交互式笔记本&#xff0c;它允许用户将代码、注释、方程式、可视化内容等整合到一个文档中&#xff0c;并支持多种编程语言&#xff0c;如 Python、R、Julia 等。它在数据科学、机器学习和教育领域中得到…