快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)
实现1:种轴partition,not in place--取定枢轴,将小于等于枢轴的放到枢轴左边,大于枢轴的放到右边
# python algorithm en_2nd edition p125
def partition_mlh(arr):
# 3-partition, use extra place
pt, seq = arr[0], arr[1:]
lt = [x for x in seq if x <= pt ]
rt = [x for x in seq if x > pt]
return lt, pt, rt
def qsort_mlh(arr):
if len(arr) <= 1: return arr
lt, pt, rt = partition_mlh(arr)
return qsort_mlh(lt) + [pt] + qsort_mlh(rt)
实现2:种轴partition,in place--取出枢轴,将小于等于枢轴的放到枢轴左边,大于枢轴的放到右边
def partition_dfq(arr, stt, end):
lt, rt = stt, end - 1 # for [stt, end)
pvt = arr[lt]
while lt < rt:
while lt < rt and arr[rt] >= pvt: rt -= 1
arr[lt] = arr[rt]
while lt < rt and arr[lt] < pvt: lt += 1
arr[rt] = arr[lt]
arr[lt] = pvt # 种轴partition
return lt
def qsort_dfq(arr, stt, end): # for [stt, end)
# if len(arr) <= 1: return arr
if end - stt < 2: return arr
pvt = partition_dfq(arr, stt, end)
qsort_dfq(arr, stt, pvt)
qsort_dfq(arr, pvt + 1, end)
return arr
实现3:比值partition,in place--以某个值为参考,大于该值的向右移,小于该值的向左移,等于该值的可能左移or右移
def qsort_zxh(arr, beg, end): #[beg, end]
# assert(len(arr) > 0 and beg >= 0 and end > beg and end < len(arr))
lt, rt = beg, end
pvt = arr[lt + (rt - lt)//2]
# pvt = arr[lt + random.randint(0, rt - lt)]
while lt < rt:
while arr[lt] < pvt and lt < end: lt += 1 # lt < end 可以写在后面
while arr[rt] > pvt and rt > beg: rt -= 1
if lt <= rt:
arr[lt], arr[rt] = arr[rt], arr[lt]
lt, rt = lt + 1, rt - 1
if lt < end: qsort_zxh(arr, lt, end)
if rt > beg: qsort_zxh(arr, beg, rt)
return arr
转载于:https://www.cnblogs.com/squirrel2300/p/7405622.html
快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)相关推荐
- 快速排序的两种实现方法(c语言版本)
经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...
- 快速排序的划分方法(5种)
快速排序的划分方法(5种) 自己做的笔记,来自看过的博客和刷题的时候的发现. 划分的方法 对于元素进行比较,只有三种结果 >/=/< 所以我们可以假设<pivot的元素是蓝色,==是 ...
- matlab三轴陀螺标定,一种mems三轴陀螺仪误差标定方法
一种mems三轴陀螺仪误差标定方法 [专利摘要]本发明涉及一种MEMS三轴陀螺仪的误差标定方法,属于试验[技术领域].本发明方法通过建立MEMS三轴陀螺仪的误差校正模型,采用双轴速率转台对MEMS陀螺 ...
- java输出值取后两位小数,java中取小数点后两位(四种步骤)
java中取小数点后两位(四种方法) 一 java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); dou ...
- LSP分两种:一种是IFS LSP,一种是non IFS LSP.
LSP分两种:一种是IFS LSP,一种是non IFS LSP.简单地说, IFS LSP制作简单,可以完成大部分的数据包监听工作; non IFS LSP制作复杂,但是可以进行一些特殊的overl ...
- 电子巡更系统服务器,一种基于iBeacon技术的电子巡更系统技术方案
[技术实现步骤摘要] 一种基于iBeacon技术的电子巡更系统 本专利技术涉及iBeacon ,具体的说,是一种基于iBeacon技术的电子巡更系统. 技术介绍 电子巡更系统是管理人员监督巡更人员是否 ...
- 【经典个性签名】--如果背叛是一种勇气,那么接受背叛需要更大的勇气
1.都说女人是衣服,姐是你们穿不起的牌子 2.姐,不寂寞.因为有寂寞陪着姐 3.不要迷恋哥,嫂子会揍你 4.別說我很高傲,只昰我拒絕与禽獸打交道 5.求而不得,舍而不能,得而不惜,这是人的最大的悲哀 ...
- imageJ把两张图片在时间轴上进行合并
imageJ把两张图片在时间轴上进行合并 方案1: 1.把单张图片都放在一个文件夹中: 2.把文件夹拖到imageJ中: 3.点击确定,自动完成了合并 定,自动完成了合并 方案2: https://b ...
- 计算机速算训练,5种速算技巧,比计算机“更神速”!值得收藏!
原标题:5种速算技巧,比计算机"更神速"!值得收藏! 小学时期的数学课被称作"算数".由名称就可见小学的数学更加看重孩子的运算能力. 运算能力看似简单普通,却是 ...
最新文章
- IDEA新建springboot项目发生错误
- 全文检索、数据挖掘、推荐引擎系列4---去除停止词添加同义词
- [深度学习] 一篇文章理解 word2vec
- [原]Jenkins(十二)---jenkins管理员用户无法登陆解决办法Access Denied
- 漫画:什么是 “图灵测试” ?
- Lync 客户端功能对比之IM功能
- 实现随着 下拉菜单中 选中值的变化 周边的值也也跟着变化。(使用【 VLOOKUP 】 函数)
- iOS笔记之UIKit_UIButton
- Hibernate 基本类型
- 代码雨代码源复制_两步教你打造一个代码雨动态壁纸效果,代码可以设置为名字...
- 看了去年这些最热的木马、病毒和电信诈骗,感觉今年不会被骗了
- HDP 03.FreeIPA安装
- 网站备案常见词汇解释汇总
- meta-inf java_jar包中的META-INF 文件夹是干嘛的?
- 如何用树莓派借用计算机的显示屏,树莓派4寸A显示屏使用教程
- OSPF骨干区域和非骨干区域通信
- python-基础语法
- Java:5大最佳Java库
- html实现多图片上传并预览,【前端预览】实现多张上传图片预览查看
- 海伦公式的计算机表达,海伦公式之算法与程序框图
热门文章
- HDFS核心进阶-namenode进阶
- 解决Tomcat无法启动的问题
- 原生js清空上一个元素内容_原生js系列 删除元素
- 特殊资源:DSP48E1和块RAM
- 记帐软件测试自学,初入软件测试必备:不知如何下手?一篇文章带你上手批量功能测试...
- 【win7系统 adb配置与adbd驱动安装记录】
- 刷机时不显示与电脑连接服务器,刷机工具,连接不上服务器,有人遇到过吗
- Python爬取代理池并清洗可用IP
- DW里面html鼠标点击特效,如何在Dreamweaver中设置手形鼠标样式效果
- English trip V2 - A 1. Mother tongue 母语 Teacher:Lamb Key: Comparative 比较级 superlative 最高级...