当前位置: 首页 > web >正文

随机快速排序算法

一、随机化原理

  • 经典快速排序 选取固定的“枢轴”(通常取第一个或最后一个元素),在最坏情况下(如已经有序)会退化为 O(n^2)

  • 随机快速排序 在每次分区前随机地从当前区间 [p..r] 中等概率选取一个枢轴,将它与末尾元素交换,再做标准分区。

  • 随机化保证任意输入上每个元素都有同样概率被选为枢轴,从而平均下能避免极端不平衡的划分,取得期望 O(n\log n)


二、算法步骤

  1. 入口调用
    调用 RQS(A, 1, n) 对长度为 n 的数组 A 进行排序。

  2. 递归基
    若子区间长度小于等于 1(即 p≥r ),直接返回。

  3. 随机选枢轴
    在 [p,r] 上用 RANDOM(p,r) 等概率选出下标 i ,交换 A[i]A[r],这样 A[r] 就是随机枢轴。

  4. 分区(Partition)
    A[r] 为枢轴做一次线性扫描,将 ≤ 枢轴的都移动到左边,返回枢轴最终位置 q 。

  5. 递归排序
    分别对左右两段 A[p..q-1]A[q+1..r] 递归调用 RQS

三、伪代码

RQS(A, p, r)
1 if p < r
2     // 随机化选枢轴
3     i ← RANDOM(p, r)
4     swap A[i] ↔ A[r]
5 
6     // 标准 Partition
7     q ← PARTITION(A, p, r)
8 
9     // 递归排序左右子区间
10    RQS(A, p, q-1)
11    RQS(A, q+1, r)// Partition: 以 A[r] 为枢轴,返回最终位置
PARTITION(A, p, r)
1 x ← A[r]
2 i ← p − 1
3 for j = p to r − 1
4     if A[j] ≤ x
5         i ← i + 1
6         swap A[i] ↔ A[j]
7 swap A[i+1] ↔ A[r]
8 return i + 1

四、时间复杂度推导

(一)最坏情况

  • 若每次随机恰巧选到当前子数组最小或最大元素,分区极端不平衡:

    T_{\max}(n) = T_{\max}(n-1) + T_{\max}(0) + \Theta(n) = T_{\max}(n-1) + \Theta(n) = \Theta(n^2).

(二)期望/平均情况

令 T(n) 为对长度为 n 的数组运行的期望时间。

  • 随机选枢轴后,其秩 k 在 {1,2,…,n} 上均匀分布。

  • 若枢轴落在第 k 小位置,则子问题规模为 k−1 和 n−k 。

这一递归可通过替换法或主定理分析得出:

T(n) = O(n\log n)

http://www.xdnf.cn/news/4301.html

相关文章:

  • GAN模型
  • 总结七种提示优化方案的核心实现流程
  • 第15章 Python数据类型详解之分解理解:基础数据类型常见易错点和性能优化篇
  • Visual Studio 快捷键更改和设置
  • 【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统
  • Java开发 自定义注解(更新中)
  • MySQL 常用函数分类
  • 编程日志4.25
  • 十分钟了解 @MapperScan
  • 盛元广通动物表型分析数字管理平台
  • framebuffer框架与示例
  • 保障企业的数据安全需要做什么?
  • npm下载插件无法更新package.json和package-lock.json文件的解决办法
  • 脑机接口:从科幻到现实,它将如何改变医疗未来?
  • 岳冉RFID手持式读写器专业研发+模块定制双驱动
  • Dynadot专业版邮箱工具指南(一):创建并设置新邮箱
  • 使用 Python 监控系统资源
  • 高等数学第五章---定积分(§5.1定积分的概念、性质和应用)
  • ShardingJdbc-水平分库
  • tinyrenderer笔记(Phong光照模型)
  • 悬崖边的摄影牧歌
  • ModuleNotFoundError 错误
  • [前端]Javascript获取元素宽度
  • Blink和V8的关系
  • Ubuntu 系统详解
  • 0基础学习鸿蒙开发-HarmonyOS4
  • 购物|电商购物小程序|基于微信小程序的购物系统设计与实现(源码+数据库+文档)
  • 我用cursor 搭建了临时邮箱服务-Temp Mail 365
  • python实战:通过输入文字匹配在docx文档中的具体位置
  • Linux进程8-共享内存概念机操作、shmget/shmat/shmdt/shmctl函数用法、空间大小修改