快速排序算法 QuickSort algorithm

news2025/1/12 2:59:43

该算法是托尼·霍尔在1960年提出。
在这里插入图片描述
算法思想:从集合中随机取一个数作为支点,然后将比它大的数放在一个集合里,比它小的数放在另一个集合中,然后再递归下去,最后便可求得有序的数组。

QuickSort(A)
1: S− = {}; S+ = {};
2: Choose a pivot A[j] uniformly at random;
3: for i = 0 to n − 1 do
4: Put A[i] in S− if A[i] < A[j];
5: Put A[i] in S+ if A[i] ≥ A[j];
6: end for
7: QuickSort(S+);
8: QuickSort(S−);
9: Output S−, then A[j], then S+;

其算法的精髓在于这个支点是随机获取的,这让这个算法变得十分的高效,下面我们来分析它的时间复杂度。
最坏的情况:选了最小的或者最大的数最为每次的支点。
在这里插入图片描述
最好的情况:每次都选的中间的数作为它的支点。
在这里插入图片描述
大多数的情况:选的不是最好的一个,选的是中间附近的一个数。
在这里插入图片描述
最好和坏情况下的时间复杂度我们可以很好的计算出来,下面我们来证明一下大多数情况下的时间复杂度:时间复杂度其实就是在计算各个元素之间的比较次数,首先我们可以看出,每两个元素之间最多会比较一次。所以我们可以去求元素之间比较的次数的期望E[X],他就可以代表大多数情况下的时间复杂度

在这里插入图片描述
Pr(A˜[i] is compared with A˜[j])就是两个元素进行比较的可能性,为2/(j-i+1).
在这里插入图片描述
找一个数很难,但如果是找一个满足一定范围的数可能会简单很多,所以我们不一定非要找中间的数作为支点,也可以找中间附近的数作为支点。
在这里插入图片描述
从上面的图我们可以看出,其中有一半的数都可以作为支点,且时间复杂度也很低,这样这个问题的难度就大大降低了。由之前1/n的概率减小到1/2。其实这个范围是不确定的,我们也可以选一个其它的范围,然后计算它的时间复杂度,也会有满足要求的范围。

ModifiedQuickSort(A)
1: while TRUE do
2: Choose a pivot A[j] uniformly at random;
3: S− = {}; S+ = {};
4: for i = 0 to n − 1 do
5: Put A[i] in S− if A[i] < A[j];
6: Put A[i] in S+ if A[i] ≥ A[j];
7: end for
8: if ∥S+∥ ≥ n
4
and ∥S−∥ ≥ n
4
then
9: break; //A fixed proportion of elements fall both below and
above the pivot;
10: end if
11: end while
12: ModifiedQuickSort(S+);
13: ModifiedQuickSort(S−);
14: Output S−, then A[j], and finally S+;

归并排序与快速排序的比较

在这里插入图片描述

所以在大多数情况下还是快速排序比较的快,但它并不能保证每一次都会很快,如果有人特意设置一个陷阱,那么你的快速排序时间复杂度就可能为O(n^2)。

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

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

相关文章

LeetCode栈和队列练习

文章目录前言1.力扣20. 有效的括号1.题目分析2.代码示现2.力扣225. 用队列实现栈1.题目分析2.代码实现3.力扣232. 用栈实现队列1.题目分析2.代码实现4.力扣622. 设计循环队列1.题目分析2.代码实现5.总结前言 之前的博客介绍的栈和队列的实现&#xff0c;本文将会对栈和队列的使…

Unity - Shader - Projector 高空云层底下透明阴影

Semitransparent Shadow - Alpha Test SoftShadow 这种方式我最早是在 cat like coding 博主的文章看到的&#xff0c;这种方式我自己亲自测试过 缺点&#xff1a;会有阴影抖动严重的现象 &#xff08;其中的 dithering tex 可以参考我之前写的&#xff1a;Unity - 手动创建…

【图神经网络论文整理】(六)—— Universal Graph Transformer Self-Attention Networks

Dai Quoc Nguyen, Tu Dinh Nguyen, Dinh PhungThe ACM Web Conference 2022 (WWW 22)Computer Vision and Pattern Recognition论文地址 本文介绍的论文是《Universal Graph Transformer Self-Attention Networks》。 该篇文章的主要贡献是将Transformer应用在GNN中用于学习图…

Java Spring Bean的实例化

Java Spring Bean的实例化 Spring框架支持两种方式去进行Bean的管理&#xff1a;BeanFactory、ApplicationContext BeanFactory&#xff1a;pom文件引入spring-context坐标&#xff0c;创建对应的待IOC类&#xff0c;然后在bean.xml注入&#xff0c;最后在调用处初始化BeanFa…

【数据结构】树与二叉树

目录 树的定义 二叉树的定义 二叉树的性质 满二叉树 完全二叉树 二叉树的存储结构 顺序存储结构 链式存储结构 遍历二叉树&#xff08;递归&#xff09; 二叉树的层次遍历 先序创建二叉树 复制二叉树 销毁二叉树 写在最后 树的定义 树是n个结点的有限集&#xf…

微信小程序中生成普通二维码,并根据二维码里的参数跳转对应的页面

微信小程序中生成普通二维码&#xff0c;并根据二维码里的参数跳转对应的页面1.打开[微信公众平台](https://mp.weixin.qq.com/)使用encodeURIComponent()对参数进行转码第一步&#xff1a;对要传递的参数进行编码第二步&#xff1a;生成二维码第三步&#xff1a;小程序中转页面…

电子元器件B2B电商平台建设方案:优化企业商流,拓宽B2B交易渠道

随着5G、汽车电子、物联网等新兴产业的发展&#xff0c;促进了相关电子元器件的市场需求快速增长。根据工信部预计&#xff0c;2023年我国电子元器件销售总额将达到2.1万亿元。而在互联网高速发展的今天&#xff0c;电子元器件交易在线化是必然趋势&#xff0c;B2B电子元器件线…

maven学习:引入

你是否早已厌倦了日复一日的手工构建工作&#xff1f;你是否对各个项目风格迥异的构建系统感到恐惧&#xff1f;Maven——Maven 的正确发音是[ˈmevən]&#xff0c;而不是“马瘟”以及其他什么瘟。Maven 在美国是一个口语化的词语&#xff0c;代表专家、内行的意思。这一Java社…

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。 假设要预测其中一个变量。比如&#xff0c;sparkling wine。如何建立一个模型来进行预测呢&#xff1f; 一种常见的方法是将该变量其视为单变量时间序列。这样就有很多方法可以…

【从零开始学微服务】04.微服务架构的特点

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务架构被技术大牛们总结出了以下九个特点&#xff1a; 服务组件化围绕业务功能产品而不是项目强终端弱管道去中心化管理去中心化数据管理基础设施自动化容错性设计演进式设计…

Python 快速入门

文章目录Python 快速入门1 环境配置1.1 简介1.2 Python 安装1.3 其余软件1.4 编辑器的使用2 基础语法2.1 特点2.2 代码块2.3 注释3 数据类型3.1 变量类型3.2 数据结构3.3 运算符3.3.1 逻辑运算符3.3.2 比较运算符3.3.3 算术运算符3.3.4 布尔运算符4 流程语句4.1 循环语句4.1.1 …

Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)

需要全部源码或运行有问题请点赞关注收藏后评论区留言~~~ 一、通过okhttp调用HTTP接口 尽管使用HttpURLConnection能够实现大多数的网络访问操作&#xff0c;但是操作过于繁琐&#xff0c;于是Andorid从9.0是使用okhttp这个框架 由于okhttp属于第三方框架 所以使用前要修改模…

我们的程序是如何跑起来的?

1.我们写的代码写完并测试以后是如何部署给用户使用的? 1. 准备所需要的服务器 2. 在服务器上安装JDK、mysql、redis、Tomcat、Nginx等环境 3. 进行mysql、redis、nginx的连接配置 4. 项目打包。前端构建打包成功后在根目录dist文件夹中&#xff1b;后端打成jar包&#xff0c…

基于改进海洋捕食者算法求解单目标优化问题附matlab代码(NMPA)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

VLAN网络支持ipv6的交换机和虚机配置

VLAN支持ipv6的交换机和虚机配置前言一、创建VLAN网络并配置交换机1.规划并在OpenStack上创建 VLAN网络2.在交换机上配置VLAN二、Ubuntu虚机配置1.创建虚机2.在OpenStack上查看port3.登录虚机配置网卡3.1登录虚机后&#xff0c;发现虚机没获取到openstack上对应port的ipv6地址。…

Qt编写跨平台视频监控系统(64通道占用7%CPU/支持win_linux_mac等)

一、前言 视频监控组件经历过数十年的迭代&#xff0c;从最初的只简单播放个rtsp视频流&#xff0c;到现在支持各种音频视频文件格式&#xff08;mp3、wav、mp4、asf、rm、rmvb、mkv等&#xff09;、支持各种视频流格式&#xff08;rtp、rtsp、rtmp、http等&#xff09;、支持…

10个JavaScript常见高级知识点

今天&#xff0c;给大家分享的是一篇干货知识《10个JavaScript常见高级知识点》&#xff0c;主要针对初级前端和想要面试找工作的同学&#xff0c;想要学好前端&#xff0c;除了要掌握JavaScript的基础知识外&#xff0c;还需要掌握一些高级的知识点。 学会了下面这些常见的高…

鼠标经过图片在边框内放大动效

鼠标没有经过&#xff1a; 鼠标经过的时候&#xff0c;看图&#xff0c;应该可以看出变化吧&#xff01;图有放大的效果。 样式&#xff1a;图片由一个盒子包着&#xff0c;盒子加上overflow:hidden的样式&#xff0c;即可以保证图片在边框内放大。 然后给图片加上动画效果就可…

JavaWeb开发之——数据库设计(20)

一 概述 数据库设计-简介数据库设计-多表关系实现数据库设计-案例 二 数据库设计-简介 2.1 软件的研发步骤 2.2 数据库设计概念 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS(Database Management System-数据库管理系统)&#xff0c;为这个业务系…

运动哪种耳机好用,推荐五款适合运动的耳机分享

​经常佩戴耳机的小伙伴都知晓传统的蓝牙耳机相对于有线耳机来说比较方便&#xff0c;但也存在着耳道一直堵塞导致细菌的滋生等因素的存在&#xff0c;但在近些年火热的骨传导耳机却能够将这些问题一一化解&#xff0c;基本可以说是百利而无一害&#xff0c;所以今天我就给小伙…