实现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(更精巧)相关推荐

  1. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  2. 快速排序的划分方法(5种)

    快速排序的划分方法(5种) 自己做的笔记,来自看过的博客和刷题的时候的发现. 划分的方法 对于元素进行比较,只有三种结果 >/=/< 所以我们可以假设<pivot的元素是蓝色,==是 ...

  3. matlab三轴陀螺标定,一种mems三轴陀螺仪误差标定方法

    一种mems三轴陀螺仪误差标定方法 [专利摘要]本发明涉及一种MEMS三轴陀螺仪的误差标定方法,属于试验[技术领域].本发明方法通过建立MEMS三轴陀螺仪的误差校正模型,采用双轴速率转台对MEMS陀螺 ...

  4. java输出值取后两位小数,java中取小数点后两位(四种步骤)

    java中取小数点后两位(四种方法) 一 java.text.DecimalFormat df = new java.text.DecimalFormat("#.##"); dou ...

  5. LSP分两种:一种是IFS LSP,一种是non IFS LSP.

    LSP分两种:一种是IFS LSP,一种是non IFS LSP.简单地说, IFS LSP制作简单,可以完成大部分的数据包监听工作; non IFS LSP制作复杂,但是可以进行一些特殊的overl ...

  6. 电子巡更系统服务器,一种基于iBeacon技术的电子巡更系统技术方案

    [技术实现步骤摘要] 一种基于iBeacon技术的电子巡更系统 本专利技术涉及iBeacon ,具体的说,是一种基于iBeacon技术的电子巡更系统. 技术介绍 电子巡更系统是管理人员监督巡更人员是否 ...

  7. 【经典个性签名】--如果背叛是一种勇气,那么接受背叛需要更大的勇气

    1.都说女人是衣服,姐是你们穿不起的牌子 2.姐,不寂寞.因为有寂寞陪着姐 3.不要迷恋哥,嫂子会揍你 4.別說我很高傲,只昰我拒絕与禽獸打交道 5.求而不得,舍而不能,得而不惜,这是人的最大的悲哀 ...

  8. imageJ把两张图片在时间轴上进行合并

    imageJ把两张图片在时间轴上进行合并 方案1: 1.把单张图片都放在一个文件夹中: 2.把文件夹拖到imageJ中: 3.点击确定,自动完成了合并 定,自动完成了合并 方案2: https://b ...

  9. 计算机速算训练,5种速算技巧,比计算机“更神速”!值得收藏!

    原标题:5种速算技巧,比计算机"更神速"!值得收藏! 小学时期的数学课被称作"算数".由名称就可见小学的数学更加看重孩子的运算能力. 运算能力看似简单普通,却是 ...

最新文章

  1. IDEA新建springboot项目发生错误
  2. 全文检索、数据挖掘、推荐引擎系列4---去除停止词添加同义词
  3. [深度学习] 一篇文章理解 word2vec
  4. [原]Jenkins(十二)---jenkins管理员用户无法登陆解决办法Access Denied
  5. 漫画:什么是 “图灵测试” ?
  6. Lync 客户端功能对比之IM功能
  7. 实现随着 下拉菜单中 选中值的变化 周边的值也也跟着变化。(使用【 VLOOKUP 】 函数)
  8. iOS笔记之UIKit_UIButton
  9. Hibernate 基本类型
  10. 代码雨代码源复制_两步教你打造一个代码雨动态壁纸效果,代码可以设置为名字...
  11. 看了去年这些最热的木马、病毒和电信诈骗,感觉今年不会被骗了
  12. HDP 03.FreeIPA安装
  13. 网站备案常见词汇解释汇总
  14. meta-inf java_jar包中的META-INF 文件夹是干嘛的?
  15. 如何用树莓派借用计算机的显示屏,树莓派4寸A显示屏使用教程
  16. OSPF骨干区域和非骨干区域通信
  17. python-基础语法
  18. Java:5大最佳Java库
  19. html实现多图片上传并预览,【前端预览】实现多张上传图片预览查看
  20. 海伦公式的计算机表达,海伦公式之算法与程序框图

热门文章

  1. HDFS核心进阶-namenode进阶
  2. 解决Tomcat无法启动的问题
  3. 原生js清空上一个元素内容_原生js系列 删除元素
  4. 特殊资源:DSP48E1和块RAM
  5. 记帐软件测试自学,初入软件测试必备:不知如何下手?一篇文章带你上手批量功能测试...
  6. 【win7系统 adb配置与adbd驱动安装记录】
  7. 刷机时不显示与电脑连接服务器,刷机工具,连接不上服务器,有人遇到过吗
  8. Python爬取代理池并清洗可用IP
  9. DW里面html鼠标点击特效,如何在Dreamweaver中设置手形鼠标样式效果
  10. English trip V2 - A 1. Mother tongue 母语 Teacher:Lamb Key: Comparative 比较级 superlative 最高级...