快排序算法(下)

简介: 快排序算法(下)

最后一个数是5

大于5的区域的第一个数是6

6和5交换

image.png

5就不用动了 在数组中固定下来

这一个过程就是partition分层过程

再在小于等于5的区域上拿最后一个数重复此过程

大于5区域上拿最后一个数重复此过程

左侧递归下去

右侧递归下去

总能让左右2个区域都有序

在一个范围上总拿这个范围的最后一个数做划分

然后把最后一个数放到小于等于区域的最后一个位置

然后让小于等于区域做递归

让大于区域也做递归

因为每次都能排好一个数

所以总有整体都有序的时候

每个区域的最后一个值可能都不一样 上面是以5为例做的说明

快排2.0基于荷兰国旗


image.png

拿最后一个数做划分 比如是5

让前面的分三个区域 小于5 等于5 大于5区域

把5和大于5区域的第一个数做交换

等于5的区域就靠在一起了

整个数组就变成 等于5的区域在中间

大于5的区域在右边

等于5的区域就不用动了

在小于5的区域上做递归

在大于5的区域上做递归

每一次递归搞定的是一批等于划分值的数

所以总有有序的时候

快排2.0版本比1.0版本快一些

因为它一次搞定一批数

举例说明

原数组

image.png

小于5区域

等于5区域

大于5区域

最后一个元素5和大于区域的第一个元素6做交换

image.png

等于5的区域在整个数组中的位置固定了

接下来在左侧区域 4301上以最后一个元素1做划分重复该行为

image.png

0继续做递归是0

4 3区域 以3做划分

总有都变成有序的时候

在右侧区域 786上 以6做划分重复该行为

image.png

左侧和右侧做递归总有都排好的时候

快排1.0和2.0时间复杂度都是O(N^2)

拿最差的例子说明

1,2,3,4,5,6,7,8,9

以9做划分 没有右侧区域

只有左侧区域

划分的过程就是partition

partition过了9个数

在左侧区域拿8做划分 没有右侧区域

只有左侧区域

partion过了8个数

每次只搞定一个

所以等差数列

所以是O(N^2)的算法

最差情况原因只有一个 划分值打的很偏

先看什么时候是好情况

image.png

好情况是划分值打在几乎中间的位置

左侧递归的规模和右侧递归的规模都是差不多的

此时的master公式是

T(N)=2 T(N/2) + O(N)

除了调用递归之外(就是partition过程)的时间复杂度是O(N)

整体的时间复杂度是 O(N*LogN)

这种是最好的情况

划分值打偏就会逐渐退化成N^2的算法

image.png

左侧很小 右侧规模很大 最差情况就是没有左侧部分 只有右侧部分

或者 右侧很小 左侧规模很大 最差情况就是没有右侧部分 只有左侧部分

不管哪一种都是O(N^2)的算法

因为总是拿数组的最后一个位置做划分

所以差情况没法避免

可以人为构建差的例子

快排3.0

在数组L~R范围上

拿谁做划分

随机选择一个数

随机选了一个数之后 拿它和最后位置上的数做交换

然后拿这个新的最后位置的数做划分

既然是随机选的

好情况和差情况就是概率事件

随机选的可能是最坏的情况 事件复杂度是O(N^2)

也可能是1/5处


image.png

image.png

master公式是

T(N)=T(4/5)+T((1/5) * N)+O(N)

每一位置都是等概率事件

每一种情况都是1/N的权重

把所有的master公式做概率累加

再求数学期望 得到的结果是O(N logN)的算法

代码

image.png

第一步等概率随机选择一个位置

把它跟最右侧位置做交换

在L~R这个范围上 拿最后位置的数即选出来的这个随机数

做partition

返回一个数组 长度一定为2

指的是划分值等于区域的左右边界

image.png

原数组最后一个数是5

按照5进行partition划分

等于5的区域是下标12和13的位置

返回的这个数组就是[12,13]

表示划分值等于区域的左右边界

p[0]就是等于区域的左边界

p[0]-1 为小于区域的右边界

然后在小于区域上递归

p[1]是等于区域的右边界

p[1]+1是大于区域的第一个数的位置

在右侧范围上递归

image.png

相关文章
|
12月前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
156 2
|
安全 网络协议
阿里云25端口解封教程完美解决25端口封禁的方法
阿里云出于安全考虑,默认封禁了TCP 25端口出方向的访问流量,所以用户无法使用25号端口邮件服务,云吞铺子分享25端口解封的方法: 阿里云25端口解封申请教程 用户想要使用25端口进行对外连接,可以在安全管控平台中提交25端口解封申请,可以参考官方文档(TCP 25端口解封申请- 阿里云),也可以参考下方云吞铺子的教程: 登录到阿里云管理控制台; 鼠标移动到头像,可以看到下拉菜单,点击“安全管控”如下图: 左侧栏“业务申请”--“25端口解封” 注意:在正式申请前,您需要确认同意并承诺,保证TCP 25端口仅用来连接第三方的SMTP服务器,从第三方的SMTP服务器外发邮件。
27284 1
|
Cloud Native Devops 持续交付
云原生技术:引领未来IT变革的核心动力
云原生技术,作为一种新型的软件开发和运行模式,正在迅速改变传统的IT架构。它通过容器化、微服务和DevOps等核心原则,使企业能够更快、更灵活地构建和部署应用程序,从而更好地适应数字化转型的需求。本文将深入探讨云原生技术的基本原理、应用场景及其在未来IT变革中的关键作用。
|
安全 应用服务中间件 开发工具
Web安全-SVN信息泄露漏洞分析
Web安全-SVN信息泄露漏洞分析
825 2
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
196 5
|
开发框架 监控 JavaScript
基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结
基于SqlSugar的开发框架循序渐进介绍(11)-- 使用TypeScript和Vue3的Setup语法糖编写页面和组件的总结
|
算法 数据可视化 数据挖掘
深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
|
存储 监控 安全
Linux日志管理工具:Logrotate(一)
Linux日志管理工具:Logrotate(一)
937 0
|
机器学习/深度学习 存储 数据可视化
手把手教你绘制和解读实用R列线图(Nomogram):从入门到精通
手把手教你绘制和解读实用R列线图(Nomogram):从入门到精通
2933 1