快速排序算法_Python实现快速排序算法

6057242626ead293b87f6c75850cf4ec.png

排序是算法的入门知识,应用广泛,且在程序员面试中,经常被提及,其中最常考的两大排序算法为快速排序与归并排序,本篇将使用Python语言来分析了解快速排序算法。


思想

快速排序是一种非常高效的排序算法,采用 “分而治之” 的思想,把大的拆分为小的,小的拆分为更小的。其原理是,对于给定的记录,选择一个基准数,通过一趟排序后,将原序列分为两部分,使得前面的比后面的小,然后再依次对前后进行拆分进行快速排序,递归该过程,直到序列中所有记录均有序。

步骤

设当前待排序序列为R[low:high],其中low ≤ high,如果待排序的序列规模足够小,则直接进行排序,否则分3步处理。

1、分解

在R[low:high]中选定一个元素R[pivot],以此为标准将要排序的序列划分为两个序列R[low:pivot-1]与R[pivot+1:high],并使序列R[low:pivot-1]中所有元素的值小于等于R[pivot],序列R[pivot+1:high]所有的值大于R[pivot],此时基准元素以位于正确位置,它无需参加后续排序。

2、递归

对于子序列R[low:pivot-1]与R[pivot+1:high],分别调用快速排序算法来进行排序。

3、合并

由于对序列R[low:pivot-1]与R[pivot+1:high]的排序是原地进行的,所以R[low:pivot-1]与R[pivot+1:high]都已经排好序后,不需要进行任何计算,就已经排好序。

注:基准元素,一般来说选取有几种方法

  • 取第一个元素
  • 取最后一个元素
  • 取第中间位置元素
  • 取第一个、最后一个、中间位置3者的中位数元素
图解

假设当前排序为R[low:high],其中low ≤ high。

1:首先取序列第一个元素为基准元素pivot=R[low]。i=low,j=high。 2:从后向前扫描,找小于等于pivot的数,如果找到,R[i]与R[j]交换,i++。 3:从前往后扫描,找大于pivot的数,如果找到,R[i]与R[j]交换,j--。 4:重复2~3,直到i=j,返回该位置mid=i,该位置正好为pivot元素。 完成一趟排序后,以mid为界,将序列分为两部分,左序列都比pivot小,有序列都比pivot大,然后再分别对这两个子序列进行快速排序。

以序列(30,24,5,58,18,36,12,42,39)为例,进行演示

1、初始化,i=low,j=high,pivot=R[low]=30

c0ab9fd2437269d54d2c8961771b39e4.png
2、从后往前找小于等于pivot的数,找到R[j]=12

538f7967135869e10e4f8d39cb2e9bf5.png

R[i]与R[j]交换,i++

d9365401f0c54b12f5ba9e1aa2ef4041.png
3、从前往后找大于pivot的数,找到R[i]=58

4c43a5fa6c5bfc8f1dd036a658f3e7f7.png

R[i]与R[j]交换,j--

ee6be93fc09e9c56ab0c3e4e43772d2d.png
4、从后往前找小于等于pivot的数,找到R[j]=18

c1f9a823364d3e2efa53073dc34e1ec1.png

R[i]与R[j]交换,i++

5c1e387631a4b1aba828b82c50457de1.png
5、从前往后找大于pivot的数,这时i=j,第一轮排序结束,返回i的位置,mid=i

2ef2af7686a6435b941ff97921708db3.png

此时已mid为界,将原序列一分为二,左子序列为(12,24,5,18)元素都比pivot小,右子序列为(36,58,42,39)元素都比pivot大。然后在分别对两个子序列进行快速排序,最后即可得到排序后的结果。

复杂度分析
  • 最好的时间复杂度为:O(nlogn)

分解:划分函数需要扫描每个元素,每次扫描元素不超过n,时间复杂度为O(n) 解决子问题:在理想的情况下,每次划分将问题分解为两个规模为n/2的子问题,递归求解两个规模的子问题。所需时间为2T(n/2) 合并:因为是原地排序,合并不需要时间复杂度 因此总运行时间为

T(n)={ O(1) , n=12T(n/2)+O(n) , n>1 }

最终求解为最好的时间复杂度为O(nlogn)

  • 最坏的时间复杂度为: O(n²)
分解:划分函数需要扫描每个元素,每次扫描元素不超过n,时间复杂度为O(n) 解决子问题:在最坏的情况下,每次划分将问题分解后,基准元素的一侧没有元素,其中一侧为规模为n-1的子问题,递归求解该子问题,所需时间为T(n-1)。 合并:因为是原地排序,合并不需要时间复杂度 因此总运行时间为
T(n)={ O(1) , n=1T(n-1)+O(n) , n>1 }

最终求解为最好的时间复杂度为O(n²)

  • 平均时间复杂度为:O(nlogn)
  • 平均空间复杂度为:O(logn)
python实现
def 
博主GitHub page地址:
影​zhan123.xin
d9f0268a4a56281eb0413eb9609e31cd.png

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

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

相关文章

用户反馈KB3189866累积更新出现卡在95%进度情况

伴随着本月的补丁星期二活动,微软面向Windows 10推出了三款累积更新。和以往相同,部分用户反馈称无法安装本次更新并导致出现各种问题。很多读者反馈称KB3189866累积更新会在45%或95%的时候卡住不动,无法执行和完成安装。 在尝试过几种临时解…

UVa1607 poj1435 UVaLive1686 Gates

填坑系列(p.246) 由函数连续性得满足二分性 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".…

c语言入门数组,C语言入门之数组(2)

二维数组前面介绍的数组只有一个下标&#xff0c;称为一维数组&#xff0c; 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的&#xff0c; 因此C语言允许构造多维数组。多维数组元素有多个下标&#xff0c; 以标识它在数组中的位置&#xff0c;所以也称为多…

IOS开发--TextField

2019独角兽企业重金招聘Python工程师标准>>> //初始化text field的位置和大小UITextField *text [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 130, 130)];//设置边框样式//样式有很多种&#xff0c;点进去查看text.borderStyle UITextBorderStyleRoun…

IOS之学习笔记十五(协议和委托的使用)

1、协议和委托的使用 1)、协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/80963731 2)、委托可以叫代理&#xff0c;实现协议的类的对象可以叫委托对象或者代理对象 3)、关键就是我们在控制器里类(获取数…

Dapr 源码解析 系列文章汇总

Dapr背后的架构模式是符合未来架构趋势&#xff08;多运行时架构&#xff09;和云原生发展趋势的。知乎 iyacontrol 对 Dapr的意义有一个很好的概括&#xff1a;对于小公司&#xff0c;甚至没有基础架构和中间件团队的公司&#xff0c;Dapr 提供了开箱即用的基础设施功能&#…

cstring判断包含字符串_Python字符串方法之-解决判断问题

19、endswith()描述&#xff1a;判断字符串是否以指定字符或子字符串结尾。语法&#xff1a;str.endswith("suffix", start, end) 或str[start,end].endswith("suffix") 用于判断字符串中某段字符串是否以指定字符或子字符串结尾。—> bool 返回值为布尔…

跨域访问-JSONP

JSONP即JSON with Padding。由于同源策略的限制&#xff0c;XmlHttpRequest只允许请求当前源&#xff08;域名、协议、端口&#xff09;的资源。如果要进行跨域请求&#xff0c;我们可以通过使用 html的script标记来进行跨域请求&#xff0c;并在响应中返回要执行的script代码&…

Angular变化检测机制

2019独角兽企业重金招聘Python工程师标准>>> 在使用Angular进行开发中&#xff0c;我们常用到Angular中的绑定——模型到视图的输入绑定、视图到模型的输出绑定以及视图与模型的双向绑定。而这些绑定的值之所以能在视图与模型之间保持同步&#xff0c;正是得益于Ang…

nx二次开发c语言,NX二次开发-UFUN API函数编程基础

1.NXOpen C 的函数函数名称的约定NX Open C 共有2类名称约定&#xff1a;一个是标准的NX Open C 的函数名称约定&#xff1b;另一个是以前版本的原有的名称约定。1.标准名称约定【格式】UF__【说明】(1)UF:User Funciton的简写&#xff0c;表示该函数为NX Open C 函数。(2)&…

Android Studio之导入安卓项目gradle编译出现问题分析日志思路

1、问题 安卓项目导入Android Studio项目之后&#xff0c;编译gradle出现问题 2、如何分析 1)、先确保电脑能上网&#xff0c;本机能上网&#xff0c;就不要设置代理 File -> Settings->Http Proxy->No proxy 然后去掉不需要的镜像 2&#xff09;、详细打印gradl…

JMeter压力测试入门教程[图文]

Apache JMeter是Apache组 织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库&#xff0c; FTP服务器, 等等。…

.NET6之MiniAPI(二十九):UnitTest

MiniAPI的单元测试与asp.net web api的单元测试大体是相同的&#xff08;毕竟都是asp.net core&#xff09;&#xff0c;只是在小细节上有一些差异&#xff0c;文章中会说到这点。本文测试框架是XUnit&#xff0c;Mock框架是Moq&#xff0c;关于这两个框架和库的学习&#xff0…

vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!

Vue思维导图目录MVC与MVVM的区别Vue基本代码结构Vue指令Vue组件class和style动态绑定computed计算属性EventBusfilter过滤器方法Vue是一套构建用户界面的框架&#xff0c;只关注视图层&#xff0c;它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。&#xff08;Vue有…

转帖不会乱码的,powershell网络蜘蛛

抓取&#xff08;爬取&#xff09;网上信息的脚本程序&#xff0c;俗称网络蜘蛛。powershell中自带了这样的两个命令&#xff0c;【Invoke-WebRequest】和【Invoke-RestMethod】&#xff0c;但这两个命令有时候会乱码。 现在转帖分享&#xff0c; 某个【歪果仁】写的脚本。来源…

Linux上搭建nginx,及简单配置

在上家公司都是运维安装nginx&#xff0c;到新公司后代码开发完成部署测试服务器要求自己装nginx&#xff0c;研究了好久安装好之后&#xff0c;到正式上线还要自己安装&#xff0c;索性把安装步骤自己记载下来&#xff08;好大一部分都是在网站找的&#xff09;。一&#xff0…

c语言打开文件并输出,文件的读取,c语言打开文件并输出

文件的读取&#xff0c;c语言打开文件并输出在做数据分析的过程中&#xff0c;经常会遇到文件的读取。我想很多人都在这个环节遇到过问题&#xff0c;所以就把自己掌握的一些文件读取方法记录下来&#xff0c;以及过程中遇到的一些状况和解决方法列出来&#xff0c;以便交流。o…

IOS学习笔记十六(NSString和NSMutableString)

1、NSString和NSMutableString NSString是不变字符串类&#xff0c;有点像java里面的String,NSMutableString是可变字符串类&#xff0c;有点类似java里面的StringBuffer 2、测试demo int main(int argc, char * argv[]) {autoreleasepool {unichar data[6] {97, 98, 100, 1…

产品经理书籍

《结网》 part1 做产品的几个要点&#xff1a;出处、目标、 壁垒、 受益人群、 商业模式、 平台现金牛、战略部署。 一个概念是否可以被有效执行出来比概念的本事更重要 要有坚定的决心更要有合理的发展路线 part2 传说中的风投&#xff1a;&#xff08;投资你的个人品质和你对…

界面连接数据库

1、获取本机的SQL Server服务器名 private void Form2_Load(object sender, EventArgs e){listBox1.Items.Clear();SQLDMO.Application SQLServer = new SQLDMO.Application();SQLDMO.NameList strServer = SQLServer.ListAvailableSQLServers();if (strServer.Count > 0){f…