【算法】快排

快速排序


  其利用的思想就是分治思想,最开始先从数组中随机选择一个元素p(为什么随机下面解释),然后以这个元素对数组中的元素进行分类,数组左侧都是小于p的元素, 右侧都是大于等于p的元素。这样就让数组分成了两部分。然后我们分别对左边和右边进行进行同样的操作(先随机选择元素,再进行分组)直到所有元素都排完序。

复杂度及优化


   时间复杂度为:O(nlogn), 空间复杂度为O(1), 不稳定排序(排序后的数组和排序前的数组中相同元素的位置改变)、原地排序。快排有些时候会出现一些比较大的问题,那就是元素p的选择,如果每次不小心选择了最大的一个元素,那么时间复杂度就会退化为O(n2),这样和选择排序毫无差别,但是我们怎么尽量避免这种情况?那就是改善选择元素的值,一开始我使用的是随机选择法,这种情况下虽然也会存在时间复杂度升高的问题,但是根据概率的情况来说几率不大,随着数组的长度越大,概率也就越低。另外还有一种办法,三数取中法,具体就是我们取第一个元素,中间一个元素和最后一个元素,然后选择大小位于中间的一个元素来作为p,这样也可以大概率避免时间复杂度升高。当数组的长度很大时,我们我们可以适当增加元素个数,比如说取五个元素然后再取大小为中间的值等等。

图示步骤


 

                                    

实现代码


 

 1 def quick(arry, start, end):
 2     if len(arry) < 2:         # 当数组中只有一个元素时就直接返回
 3         return
 4     index = quickly_sort(arry, start, end)   # 第一次进行分组
 5 
 6     if index > start:                        # 如果分组之后的下标还是大于起始位置,继续进行分组排序。
 7         quick(arry, start, index-1)
 8     if index < end:                          #  如果分组之后的下标小于结束位置, 则继续进行分组排序。
 9         quick(arry, index+1, end)
10 
11 
12 def quickly_sort(arry, start, end):          
13     if len(arry) < 1:
14         return
15     index = random.randint(start, end)       # 随机选择一个下标
16     arry[index], arry[end] = arry[end], arry[index]      # 交换下标位置和最后一个元素之间的位置,
17     small = start - 1                        # 大于标志元素的标志位
18     for i in range(start, end): 
19         if arry[i] < arry[end]:              
20             small += 1
21             if small != i:        
22                 arry[small], arry[i] = arry[i], arry[small]     # 交换两个元素
23     small += 1                                                  # 
24     arry[small], arry[end] = arry[end], arry[small]             # 最后交换分组之后的分界位置,
25     return small

图示:


         

 

转载于:https://www.cnblogs.com/GoodRnne/p/10606088.html

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

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

相关文章

【C基础】堆内存创建/释放和内存清理函数/内存泄漏

本期涉及到了较多的指针&#xff0c;没有彻底领悟的同学请翻阅之前的博文~ 一闪一闪亮晶晶&#xff0c;满天都是小星星*** 什么是堆内存&#xff1a; 是进程的一个内存段(text、data、bss、heap、stack)之一&#xff0c;由程序员手动管理&#xff0c; 特点就是足够大&#x…

19_05_01校内训练[polygon]

题意 把一个边长为1的正n边形放到一个正m边形中&#xff0c;要求m边形完全覆盖n边形&#xff0c;可以有交点&#xff0c;并且中心重合。求正m边形的最小边长&#xff0c;至少精确到6位。要求logn计算。 思考 先考虑m|n的情况。 我们知道&#xff0c;正m边形的边长与可行区域&am…

六度人脉 全球最高效的人脉法则(图)

六度人脉这一概念&#xff0c;在20世纪60年代由美国心理学家Stanley Milgram提出并验证。 所谓六度人脉&#xff0c;即地球上所有的人都可以通过六层以内的熟人关系链和其他人联系起来。 通俗地说&#xff1a;“最多通过六个人你就可以认识地球上任何一个陌生人。” SNS(社会…

[转]numpy中的np.max 与 np.maximum区别

转自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 转载于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在压力测试环境某一个服务出现crash了&#xff0c;经过一番检查&#xff0c;终于发现是由于JVM的Finalization Delay引起的&#xff0c;这个问题比较特殊&#xff0c;这里记录一下。 这个服务是用Java写的&#xff0c;主要完成的功能是根据特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的问题及解决

首先进入PHP官网下载php7的版本,我下的是PHP7.1.28,在PHP的下载页面注意划红线和绿线的地方(我画的) 1.画了红线的意思是请使用由apache lounge提供的编译文件,也就是点进蓝色Apache lounge这里下载. 2.画了绿色的线的意思是用Apache的话你必须使用Thread Safe(线程安全)的PHP…

缓存区的输入输出,字符串常用操作,实现strlen/strcpy/strcat/strcmp函数)

输出缓冲区&#xff1a; 程序输入的数据并不能立即显示在屏幕上&#xff0c;而是先存储在输出缓冲区中&#xff0c;满足一些条件后才显示出来。 1、遇到\n后 2、遇到输入语句 3、当输出缓冲区满4K 4、当程序结束 5、手动刷新 fflush(stdout) 缓冲区机制可以提高数据的读写速度…

理性分散投资 收益袋袋平安

理财锦囊 想要投资理财&#xff0c;不光可以选择股票和债券这类入门产品&#xff0c; 实际上&#xff0c;还可选择其他低风险及高回报的投资产品&#xff0c;例如外汇、期货和商品。 针对此&#xff0c;几位分析师预测了2014年各国经济走势的重点&#xff0c;协助散户们分配…

AI一周热闻:华为豪掷3.3亿剑桥买地,自建光芯片工厂;比特大陆IPO失败,组织架构调整...

导读 华为豪掷3.3亿剑桥买地&#xff0c;自建光芯片工厂苹果春季发布会无硬件发布&#xff0c;转型之心迫切比特大陆IPO失败&#xff0c;组织架构调整&#xff0c;王海超任CEO特斯拉起诉小鹏汽车员工窃取商业机密英伟达发布GauGAN&#xff0c;线条色块秒变逼真图像用机器学习防…

Docker 环境:Nexus3.x 的私有仓库

Nexus3.x 的私有仓库 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的&#xff…

虚拟环境vitualenv的使用

Python3开发之虚拟环境virtualenv与virtualenvwrapper 在使用 Python 开发的过程中&#xff0c;工程一多&#xff0c;难免会碰到不同的工程依赖不同版本的库的问题&#xff1b; 亦或者是在开发过程中不想让物理环境里充斥各种各样的库&#xff0c;引发未来的依赖灾难。 此时&am…

find_first_of和find函数的区别

小记&#xff1a; find_first_of函数最容易出错的地方是和find函数搞混。它最大的区别就是如果在一个字符串str1中查找另一个字符串str2&#xff0c;如果str1中含有str2中的任何字符&#xff0c;则就会查找成功&#xff0c;而find则不同&#xff1b;

银行各类理财收益渐涨 各类宝钱景尚不明朗

这个春天&#xff0c;投资似乎进入了一个好事多磨的阶段。央行一反先前支持的态度&#xff0c;开始对互联网理财念起了“紧箍咒”。一时间&#xff0c;各种“宝”的命运变得扑朔迷离起来。尽管各种“宝”声明&#xff1a;不受央行政策影响。而投资者内心的担忧&#xff0c;恐怕…

Firefox 66回归!修复多项臭虫相关问题

上周最新版Firefox 66因为爆出会使微软Office 365中的PowerPoint文字消失的臭虫&#xff0c;Mozilla暂停发送。3月27日Mozilla重新释出修补完成的最新版Firefox 66.0.2。根据Mozilla臭虫报告网页&#xff0c;Firefox 66除了造成Office 365中的PowerPoint文字消失的问题外&#…

PHP全栈学习笔记27

数组概述&#xff0c;类型&#xff0c;声明&#xff0c;遍历&#xff0c;输出&#xff0c;获取数组中最后一个元素&#xff0c;删除重复数组&#xff0c;获取数组中指定元素的键值&#xff0c;排序&#xff0c;将数组中的元素合成字符串。 数组概述&#xff0c;数组是存储&…

Docker : 数据卷(创建、挂载、查看、删除)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 数据卷 数据卷 是一个可供一个或多个容器使用的特殊目录&#xff0c;它绕过 UFS&#xff0c;可以提供很多有用的特性&#xff1a; 数据卷…

mac地址和ip地址的区别(转)

先纠正一下几个比较模糊的概念&#xff1a;“MAC地址表储存IP地址”&#xff0c; MAC地址表是二层设备中存储“MAC地址”和“转发端口”映射关系的表&#xff0c;并不直接存储IP地址。 “路由器根据MAC地址来选择路由进行数据发送”&#xff0c;对于三层设备的三层端口来说&…

你是否发现 职业能力危机,请 警惕

身在职场&#xff0c;你有不有遭遇职业能力危机呢 ? 核心竞争力的增长是职业持续性发展的基础&#xff0c;随着年龄的增长和工作经验的积累&#xff0c;有的职场人士保持着良好的发展势态&#xff0c;有的却越来越落伍&#xff0c;竞争力越来越弱。只有能力跟得上变化&#x…

你的GitHub,怎么和我用的不太一样?

说起代码托管&#xff0c;相信绝大多数人脑海中浮现出的第一个词都是“GitHub”。经过多年的发展&#xff0c;GitHub俨然已经成为了代码托管领域的标签…随着国内互联网环境的优化&#xff0c;互联网产业链的不断壮大&#xff0c;越来越多的产业被拉入到了互联网中来&#xff0…

Windows下多个JDK版本的切换方法

问题 因我之前在window中无法命令行输入&#xff0c;后来发现是电脑中存在多个JDK&#xff0c;导致设置混乱。于是&#xff0c;我继续深入研究了当电脑存在多个JDK的情况下&#xff0c;如何设置想要的JDK版本。步骤 1.更改环境变量 进入环境变量的配置界面&#xff0c;将JAVA_H…