c++ 快速排序_常用排序算法之快速排序

前天给大家分享了归并排序,但是它不是原地排序算法,需要消耗额外的内存空间,今天给大家分享的是江湖无人不知无人不晓的"快排"--快速排序。

快排是小生接触开发学会的第一个排序算法

快速排序原理

快排也用到了分治思想。快排的核心思想是:如果要排序的数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为分区点 pivot。

我们遍历p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot ,后面的 q+1 到 r 之间都是大于 pivot 的。

如下图:

5e3638c8398589d88087c12a8fde3944.png

根据分治、递归的处理思想,我们可以用递归排序从下标 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为1,就说明所有的数据都有序了。快排不需要归并那样做合并,也不需要额外的存储空间,在时间复杂度一样的情况下有着比归并更好的空间复杂度表现。

快排首先找到分区点,一般我们会将数组第一个或最后一个元素作为 pivot,我们以最后一个作为分区点 pivot,然后通过两个变量 i 和 j 作为下标来循环数组,当下标 j 对应数据小于 pivot 时,交换 i 和 j 对应数据,并且将 i往前移动一位,否则 i 不动,下标 j 始终是往前移动的, j 到达终点后,将 pivot 如下标 i 对应数据交换,这样最终将 pivot 置于数组中间,[0...i-1]区间的数据都比 pivot 小,[i+1...j] 之间的数据都比 pivot 大,我们以递归的方式循环处理,最终整个数组都会变成有序的,如下图:

0a41602fa71aa11c67834b7eb668f42d.png

因为分区的过程涉及交换操作,如果数组中有两个相同的元素,比如序列 7, 9,5,7,3,6 经过第一次分区操作之后,两个 7的相对先后顺序会改变。所以,快速排序并不是一个稳定的排序算法。

代码示例

Go语言:

package mainimport "fmt"func main() {  arr := []int{8, 3, 4, 5, 9, 2, 1}  QuickSort(arr)  fmt.Println(arr)}func QuickSort(arr []int) {  separateSort(arr, 0, len(arr)-1)}func separateSort(arr []int, start, end int) {  if start > end {    return  }  i := partition(arr, start, end)  separateSort(arr, start, i-1)  separateSort(arr, i+1, end)}func partition(arr []int, start, end int) int {  pivot := arr[end]  var i = start  for j := start; j < end; j++ {    if arr[j] < pivot {      if !(i == j) {        arr[i], arr[j] = arr[j], arr[i]      }      i++    }  }  arr[i], arr[end] = arr[end], arr[i]  return i}

PHP示例:

function quick_sort($nums){    if (count($nums) <= 1) {        return $nums;    }    quick_sort_c($nums, 0, count($nums) - 1);    return $nums;}function quick_sort_c(&$nums, $p, $r){    if ($p >= $r) {        return;    }    $q = partition($nums, $p, $r);    quick_sort_c($nums, $p, $q - 1);    quick_sort_c($nums, $q + 1, $r);}// 寻找pivotfunction partition(&$nums, $p, $r){      $pivot = $nums[$r];    $i = $p;    for ($j = $p; $j < $r; $j++) {        // 原理:将比$pivot小的数丢到[$p...$i-1]中,剩下的[$i..$j]区间都是比$pivot大的        if ($nums[$j] < $pivot) {            $temp = $nums[$i];            $nums[$i] = $nums[$j];            $nums[$j] = $temp;            $i++;        }    }    // 最后将 $pivot 放到中间,并返回 $i    $temp = $nums[$i];    $nums[$i] = $pivot;    $nums[$r] = $temp;    return $i;  }  $nums = [4, 5, 6, 3, 2, 1];  $nums = quick_sort($nums);  print_r($nums);

JS示例:

const swap = (arr, i, j) => {    const temp = arr[i]    arr[i] = arr[j]    arr[j] = temp}// 获取 pivot 交换完后的indexconst partition = (arr, pivot, left, right) => {    const pivotVal = arr[pivot]    let startIndex = left    for (let i = left; i < right; i++) {        if (arr[i] < pivotVal) {            swap(arr, i, startIndex)            startIndex++        }    }    swap(arr, startIndex, pivot)    return startIndex}const quickSort = (arr, left, right) => {    if (left < right) {        let pivot = right        let partitionIndex = partition(arr, pivot, left, right)        quickSort(arr, left, partitionIndex - 1 < left ? left : partitionIndex - 1)        quickSort(arr, partitionIndex + 1 > right ? right : partitionIndex + 1, right)    }}

性能分析

最后我们看下快速排序的性能和稳定性:

  1. 时间复杂度:是O(nlogn),同样要优于冒泡和插入排序
  2. 空间复杂度:不需要额外的空间存放排序的数据,是原地排序
  3. 算法稳定性:涉及数据交换,可能破坏原来相等元素的位置排序,所以是不稳定的排序算法

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

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

相关文章

k8s ubuntu cni_手把手教你使用RKE快速部署K8S集群并部署Rancher HA

作者&#xff1a;杨紫熹原文链接&#xff1a;https://fs.tn/post/PmaL-uIiQ/RKE全称为Rancher Kubernetes Engine&#xff0c;是一款经过CNCF认证的开源Kubernetes发行版&#xff0c;可以在Docker容器内部运行。它解决了Kubernetes社区中最常见的问题——安装十分复杂。借助RKE…

linux du -sh 脚本,Linux之shell脚本(2)

Linux之shell脚本(2)一、printf命令&#xff1a;printf是一个把从标准输入的字符按照你所要求的格式输出到标准输出即屏幕的命令.在很多时候&#xff0c;我们可能需要将自己的数据给他格式化输出的。1.格式化输出。(print format)2.命令格式&#xff1a;printf打印格式实际内容…

python异常值删除_python数据清洗中,是如何识别和处理异常值的?

异常值处理是pythonshujuqingxi/ stylecolor:#000;font-size:14px;>python数据清洗中重要的步骤&#xff0c;虽然异常值出现频率比较低&#xff0c;但是如果置之不理的话&#xff0c;还是会对实际项目的分析造成偏差&#xff0c;所以今天小编就跟大家分享pythonshujuqingxi/…

啊哈c语言答案1.3,啊哈C语言编程-第2课-让计算机开口说话

为什么会有计算机的出现呢&#xff1f;我们伟大的人类&#xff0c;发明的每一样东西都是为了帮助我们改善生活。计算机同样是用来帮助我们的工具。想一想&#xff0c;假如你现在希望让计算机帮助你做一件事情&#xff0c;你首先需要做什么&#xff1f;是不是要先与计算机进行沟…

用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花

本文转自&#xff1a;DF创客社区-未经许可不可转载原文链接&#xff08;附件请于原文下方下载&#xff09;&#xff1a;用新款ws2812灯带做一个简单的窗花-创意生活论坛-DF创客社区​mc.dfrobot.com.cn作者&#xff1a;屌丝王小明很高兴提前拿到了DF即将上架的新品——ws2812灯…

c语言锁屏密码程序,求一个VB锁屏程序的源文件

满意答案nan67182014.07.08采纳率&#xff1a;53% 等级&#xff1a;12已帮助&#xff1a;8369人我原来写的一个缩屏的程序&#xff0c;后来没用&#xff0c;当时只是为了测试透明窗体的.代码给你参考下。功能差一个禁用任务管理器的功能Private Declare Function GetWindowL…

抗侧力构件弹性位移如何计算_说一说现在很火的装配式建筑怎么计算?

装配整体式剪力墙结构体系&#xff0c;其主要预制构件包括承重墙(预制剪力墙)、非承重墙(外填充墙、内隔墙等)、预制楼梯(预制楼梯梯段&#xff0c;端部伸出连接钢筋&#xff0c;伸入叠合平台板&#xff0c;通过叠合现浇形成整体楼梯)、预制阳台板(根据建筑要求&#xff0c;整体…

微软私有云解决方案_微软发布电信云平台 ,互联网巨头争夺5G网络商机

微软发布电信云平台 &#xff0c;互联网巨头争夺5G网络商机微软公司周一发布了全新的云平台&#xff0c;能够帮助电信运营商更快地构建5G网络&#xff0c;降低成本并向企业客户出售定制服务。这一5G的新平台将在微软云Azure上运行&#xff0c;微软表示使用该平台将降低基础架构…

fanuc机器人编程手册_是谁需要G代码编程机器人?

用G代码编程机器人是一个5&#xff0c;6年前就碰到过的一个概念。当时就有点困惑&#xff0c;不过没有细究为何提出这样的想法。这个问题一直搁置很久也没有想起来主动去了解&#xff0c;去和同行去交流。今天在翻阅西门子自动化产品手册时&#xff0c;看到SINUMERIK产品介绍后…

java各个平台订单动态对接_平台订单丨全国各地最新采购、代加工订单,免费联系对接...

寻求&#xff1a;地铁闸机加工件定制加工需要两种闸机&#xff0c;一种扇门&#xff0c;一种旋转扇门&#xff0c;两必须都按照图纸加工&#xff0c;请仔细审核图纸&#xff0c;欢迎有实力的友商前来洽谈&#xff0c;不符勿扰&#xff0c;谢谢&#xff01;求购&#xff1a;镀锌…

零基础入门c语言免费教程,C语言零基础急速入门免费教程不定期更新

很多粉丝问我陈老师为什么你会教c语言和java语言&#xff1f;因为名字中”陈“字的汉语拼音中“chen””陈“&#xff0c;和“c”语言是同一个首字母“c”&#xff0c;所以我教“c”语言。又因为同学、学生、粉丝、朋友、同事、亲人们叫我杰哥&#xff0c;汉语拼音中的”jie“&…

python单词什么意思_“逐字逐句”是什么意思?语法在Python中意味着什么?

I see the following script snippet from the gensim tutorial page. Whats the syntax of word for word in below Python script? >> texts [[word for word in document.lower().split() if word not in stoplist] >> for document in documents] 解决方案 T…

平台型时间信号强度曲线_哥测的不是BET,是氮气等温吸脱附曲线

平时经常会说去测个BET&#xff0c;看看材料比表面积多大&#xff0c;孔径分布如何&#xff0c;其实我们测试的并不是BET&#xff0c;而是氮气等温吸脱附曲线&#xff0c;测试得到的数据是氮气等温吸脱附曲线&#xff0c;比表面积、孔径分布都是通过公式计算得到的。所以本文旨…

python整数类型在每一台计算机上的取值范围是一样的_人工智能第一章:Python语言基础...

1 Python简介 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 1.1 起源 Python的作者是著名的…

android震动服务能设置时长么,Android实现手机振动设置的方法

本文实例讲述了Android实现手机振动设置的方法。分享给大家供大家参考。具体如下&#xff1a;main.xml布局文件&#xff1a;android:orientation"vertical" android:layout_width"fill_parent"android:layout_height"fill_parent">android:la…

请概述可视化卷积神经网络的中间输出的基本思想。_最详细的卷积神经网络入门指南!...

编辑&#xff1a;murufengDate&#xff1a;2020-05-15来源&#xff1a;深度学习技术前沿微信公众号链接&#xff1a;干货|最全面的卷积神经网络入门教程卷积神经网络简介卷积网络 (convolutional network)(LeCun, 1989)&#xff0c;也叫做卷积神经网络 (convolutional neural n…

python指定位置写入文件_Python从文件中读取指定的行以及在文件指定位置写入

Python从文件中读取指定的行以及在文件指定位置写入 Python从文件中读取指定的行 如果想根据给出的行号&#xff0c; 从文本文件中读取一行数据&#xff0c; Python标准库linecache模块非常适合这个任务: 测试文件内容 &#xff1a; This is line 1. This is line 2. This is l…

华硕 x86 android,【华硕X79评测】学不会不收费 几步教你安装Android x86-中关村在线...

安装Android x86其实并不困难【中关村在线】华硕X79评测&#xff1a; 话说最近操作系统这个话题非常火爆。也许是借助于Windows 8消费者预览版的光芒&#xff0c;凡是与系统搭边的东西大家好像都喜欢与Windows 8进行比较。介于现在可以使用的系统众多&#xff0c;其中Android x…

springboot用户管理系统_Springboot优秀开源项目

前言 作为一个开发人员来说,快速的熟悉一项技术就是去使用它.伟大的作家鲁迅先生曾说过:看别人视频不如自己敲代码!作为一个菜鸡开发,我平时也致力于收集各种大神的开源项目!接下来就给大家带来我绞尽乳汁为大家搜罗的几个开源的好项目吧!1. 基于springboot Vue 的人事管理系统…

第一次失效_又到审核季,内审员们,咱如何开好第一次会议?

导读作为一名企业的内审员&#xff0c;展开工作将从第一次会议开始&#xff0c;那么如何组织好第一次会议将是十分关键的&#xff0c;今天小编特地跟大家一起分享下首次会议召开的案例&#xff0c;手把手教你怎么成功召开首次会议&#xff1a;首次会议由审核组长主持。01 签到与…