【数据结构】——快速排序

 

目录

一、代码

二、复杂度:O(nlog(n))

三、快速排序的劣势


视频参考链接:https://www.bilibili.com/video/BV1mp4y1D7UP?p=17

一、代码

'''
思想:假设是对一个list进行排序
1、选取第一个元素作为p元素;
2、将p元素归位,即将小于p元素的元素放在列表左边,将大于p元素的元素放在列表右边
3、通过2实现了p元素的归位,这样就将列表分成了两个子列表,对左右两个子列表重复使用1、2步骤,实现快速排序
'''
import timedef partition1(li:list,left:int,right:int)->int:'''这是根据路飞商城的思路来的将p元素归位的函数:取第一个元素为p元素,移动right,若right指针的值大于P,则right继续往左移动,否则停止移动,将值赋值给left所在的位置;然后再移动left,若left指针的值小于P,则left继续往右移动,否则停止移动,将值赋值给right所在的位置;如此交替移动,直到left=right时,停止,并将P值赋值给left(right):param li: 需要归位的列表:param left: 列表左指针索引,初始值为0:param right: 列表右指针索引,初始值为len(li)-1:return: 返回p归位的索引'''#得到要归位的元素(第一个元素)p = li[left]#当列表有两个元素时,才进行排序while left < right:# 保证有两个元素#这里我们从列表的右边开始进行元素的比较while left < right and p <= li[right]: # 至少两个元素并且p元素值小于等于right指针指向的值时,右指针左移right -= 1 # right 左移一步li[left] = li[right] # 不满足上述循环条件时,停止移动right,并且将right上的值赋值给left#右指针停止移动后,开始进行左指针的移动while left < right and p >= li[left]:left += 1li[right] = li[left]#当left = right时,说明已经归位了,将p赋值给归位位置li[left] = preturn leftdef quickSorted1(li,left,right):'''对列表进行快排:param li: 需要排序的列表:param left: 左索引:param right: 右索引:return: 返回排好序的列表'''if left < right:mid = partition1(li, left, right)  # 首先得到第一个归位索引# 对左边列表进行排序quickSorted1(li,left,mid-1)# 对右边列表进行排序quickSorted1(li,mid + 1,right)#-----------------------------------------------------------------------def partition2(li,left,right):'''这个的主要思路是自己的思路主要思路就是左右交替进行比较,然后将没有元素的位置赋值为None,如当p>右指针的值时,先将right的值赋值给left,再将right值赋值为None,:param li: :param left: :param right: :return: '''p = li[left]li[left] = Nonewhile left < right:if li[left] == None: # 若检测到左指针为空时if p > li[right]: # 若p元素大于right指向的值时li[left] = li[right] # 将right值赋值给leftli[right] = None # 此时right为空print(li,"right")else:right -= 1 # 若p元素小于right值,则right左移else:if p < li[left]: # 若p元素小于left指向的值时li[right] = li[left] # 将left值赋值给rightli[left] = None # 此时left为空print(li, "left")else:left += 1 # 若p元素大于left值,则left右移li[left] = preturn leftdef quickSorted2(li,left,right):'''对列表进行快排:param li: 需要排序的列表:param left: 左索引:param right: 右索引:return: 返回排好序的列表'''if left < right:mid = partition2(li, left, right)  # 首先得到第一个归位索引# 对左边列表进行排序quickSorted2(li,left,mid-1)# 对右边列表进行排序quickSorted2(li,mid + 1,right)li = [5,7,4,6,3,1,2,9,8]
startTime1 = time.time()
quickSorted1(li,0,len(li)-1)
endTime1 = time.time()
print(li,"method1")
print("method1用时:%9f"%(endTime1-startTime1))#-----------------------------------------------------startTime2 = time.time()
quickSorted2(li,0,len(li)-1)
endTime2 = time.time()
print(li,"method2")
print("method2用时:%9f"%(endTime2-startTime2))

二、复杂度:O(nlog(n))

当需要排序的元素个数少的时候,二者的运算速度没有什么区别,但是当数字为10000的时候,就会发生比较大的差别

第一种方法:0.04897332191467285

第二种方法:直接就报递归栈溢出的错误了。。。“进程已结束,退出代码-1073741571 (0xC00000FD)”

三、快速排序的劣势

1、对于Python会有递归最大深度的限制

2、在对一组倒序的列表进行正序时,其复杂度接近于O(n^2)

解决方法:

a、每一次随机从列表中抽取一个元素作为p元素;

b、在进行排序前,先打乱列表再进行排序,这其实是很奇妙的,通过打乱顺序来提高效率,第一次听说,但是它就是达到了这种效果,amazing~

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

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

相关文章

读取数据库信息构建视图字段的备注信息,方便程序代码生成

在很多情况下&#xff0c;我们开发都需要有一个快速的代码生成工具用来提高开发效率&#xff0c;代码生成工具很多信息都是读取数据库的表、视图等元数据进行对象表信息的完善&#xff0c;有了这些信息&#xff0c;我们就可以在普通的实体类代码里面添加属性字段的中文注释&…

微博分享错误

昨天再做这块的时候&#xff0c;不知怎么的点击之后什么反应都没有&#xff0c;程序也没有崩&#xff0c;日志倒是输出了这个错误 解决办法&#xff1a;打开你写分享的代码跟API文档对比一下创建文本、图片或者网页的时候是不是少写了那个属性&#xff0c;我这里是在创建网页的…

代码生成工具之界面快速生成

界面开发&#xff0c;无论对于Web开发&#xff0c;还是Winform开发&#xff0c;都需要耗费一定的时间&#xff0c;特别对于一个数据库字段比较多的界面&#xff0c;一般就需要在编辑界面上摆的更多的控件来做数据显示&#xff0c;每次碰到这个&#xff0c;都有点头痛&#xff0…

javascript - 封装原生js实现ajax

1 /*2 * ajax方法3 */4 var Ajax function() {5 var that this;6 //创建异步请求对象方法7 that.createXHR function() {8 if(window.XMLHttpRequ…

QT对象树、信号和槽机制

文章目录一 、对象树是什么&#xff1f;二、信号和槽的基本概念2.1 信号2.2 槽2.3 松散耦合2.4 特点三、示例总结一 、对象树是什么&#xff1f; 对象树是由父类和若干子类对象组成&#xff0c;而子类也可以由若干孙类。 QT中的对象树是以QObject为起始父类来完成树的构建的&a…

【数据结构】——归并排序

目录 一、代码 二、随笔 一、代码 归并排序的主要思路&#xff1a;将两个有序的子列表归并为一个有序的大列表 #归并函数&#xff0c;假设li是由左右两个有序的子列表组成,假设两个子列表都是从小到大排好序的列表 def merge(li,low,mid,high)::param li: 由左右两个有序的子列…

开发发布npm module包

开发发布npm module包 问题 在项目开发过程中&#xff0c;每当进入一个新的业务项目&#xff0c;从零开始搭建一套前端项目结构是一件让人头疼的事情&#xff0c;就要重新复制一个上一个项目的前端框架和组件代码库。其中很多功能的模块组件都要重复拷贝&#xff0c;可以统一将…

如何使用ATS提高应用的安全性

App Transport Security&#xff0c;简短的说就是ATS&#xff0c;是iOS9和OS X El Capitan的一个新特性。App Transport Security 的目标是提高Apple 操作系统的安全性以及在此操作系统上运行的任何应用的安全性。 基于HTTP传输数据的网络请求都是明文。开启App Transport Secu…

手机客户端测试考虑的点

手机客户端测试考虑点总结 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 此文未本人工作中的总结&#xff0c;特此总结。 异常场景&#xff1a; 网络异常&#xff0c;服务器异常&#xff0c;接口异常或参考参数篡改&#xff0c;断电&#xff0c;…

NMS(非极大值抑制)算法详解与示例

一、NMS是什么&#xff1f; NMS&#xff08;non maximum suppression&#xff09;即非极大值抑制&#xff0c;广泛应用于传统的特征提取和深度学习的目标检测算法中。 NMS原理是通过筛选出局部极大值得到最优解。 在2维边缘提取中体现在提取边缘轮廓后将一些梯度方向变化率较小…

【转载】ASP.NET应用程序与页面生命周期

在本文中&#xff0c;我们将了解不同的事件&#xff0c;ASP.NET 应用程序的生命周期以浏览器向 Web 服务器&#xff08;对于 ASP.NET 应用程序&#xff0c;通常为 IIS&#xff09;发送请求为起点&#xff0c;直至将请求结果返回至浏览器结束。在这个过程中&#xff0c;首先我们…

基于PCL的ICP及其变种算法实现

文章目录前言一、ICP算法基础1.1 提取待匹配点对1.2 计算旋转平移矩阵1.3 计算变换后的点和目标点之间的偏差二、ICP算法变种2.1 PLICP2.2 PointToPlane ICP2.3 NICP2.4 LM_ICP三、程序示例1. 传统方法2. PointToPlane ICP总结前言 ICP&#xff08;Iterative Closest Point&am…

【数据结构】——排序算法系列总结

目录 1、空间复杂度 2、稳定性 3、运行时间 4、目前默认的sort内置函数排序函数 5、六种常用排序方法 1、空间复杂度 空间复杂度产生的原因有两个&#xff1a;①重新定义了一块空间用于存储数据&#xff1b;②递归产生了栈空间 冒泡排序、选择排序、堆排序和插入排序属于…

Spring Boot实践教程(二):SpringApplication分析

2019独角兽企业重金招聘Python工程师标准>>> 本文会通过分析上一篇中跑起来的示例程序来分析一下Spring Boot程序运行的基本原理。 概要 在上一篇的介绍中&#xff0c;程序是通过SpringBoot1HelloworldApplication.main()方法运行起来的&#xff1a; public static …

基于PCL的MLS(移动最小二乘)算法简介与示例

一、MLS基础 mls算法本质上和最小二乘一样&#xff0c;是一种拟合数据的算法。区别在于mls是局部的&#xff0c;即通过系数向量和基函数分别对数据中不同位置的节点区域进行拟合&#xff0c;需要计算出全部节点域的拟合函数的参数。而传统的最小二乘是全局的&#xff0c;采用所…

基于PCL的RANSAC(随机采样一致)算法简介与示例

前言 RANSAC&#xff08;Random sample consensus&#xff0c;随机采样一致&#xff09;是3D点云拟合的一种重要的手段&#xff0c;可以对直线、圆、平面&#xff0c;圆球、圆柱等形状的点云进行拟合&#xff0c;其优点在于可以最大程度上减少噪声点对拟合效果的影响。 一、RA…

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场

Testin云測与ARM 战略合作&#xff1a;推动全球移动应用加速进入中国市场 2014/10/14 Testin 业界资讯&#xff08;中国北京–2014年10月14日 &#xff09;全球最大的移动游戏、应用真机和用户云測试平台Testin云測今日宣布与ARM建立战略伙伴合作关系&#xff0c;设立“ARM应…

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式&#xff1a; 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。 下面就看看正则表达式里…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件转py文件及no Qt platform plugin could be initialized 问题解决】

目录 一、寻找designer.exe 二、no Qt platform plugin could be initialized 问题解决 三、ui文件转换为py文件 四、pyqt5的使用教程 一、寻找designer.exe 头疼&#xff0c;找了一上午都没有找到这个的路径&#xff0c;最后还是在评论区看到的&#xff0c;这也不能怪人家…

PCL中GreedyProjection三角化算法简介与示例

文章目录前言一、PCL点云三角化1.1 Delaunay三角剖分1.2 贪婪三角化二、程序示例总结前言 Delaunay三角剖分最初应用于2维领域&#xff0c;而与Greedy三角化算法的结合&#xff0c;使之成为目前在三维重建领域最为基础的算法原理之一&#xff0c;很多学者针对其原理进行改进用…