实现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

快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)的更多相关文章

  1. Java中取小数点后两位(四种方法)

    摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法)   一 Long是长整型,怎么有小数,是double吧     java.text.D ...

  2. 程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题.

    1.程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题. 2.可以根据异常寻找问题. 3.可以根据异常寻找问题

  3. 两款主流项目管理软件PK,哪个更好用?

    两款主流项目管理软件PK,哪个更好用? 一.产品介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领 ...

  4. 快速排序的两种实现方法(js)

    快速排序的基本思想:通过一趟排序,将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的.----------- ...

  5. 【C/C++】快速排序的两种实现思路

    方法一:不断填坑,一次确定一个值.http://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h> vo ...

  6. 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系

    (1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...

  7. 关于 第三方接口支付的时候 采用post提交的方式,有两种 一种是通过 curl来进行,一种是通过js当页面加载完后跳转

    这是第一种.通过javascript页面加载完后,对表单采用 post方式提交给 第三方接口----- echo <<<_END<!DOCTYPE html PUBLIC &q ...

  8. Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…

    Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...

  9. Vue 定义组件模板的七种方式(一般用单文件组件更好)

    在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...

随机推荐

  1. JS打开新窗口防止被浏览器阻止的方法

    这篇文章主要介绍了JS打开新窗口防止被浏览器阻止的方法,分析对比了常用方法与改进方法,是非常实用的技巧,需要的朋友可以参考下 本文实例讲述了JS打开新窗口防止被浏览器阻止的方法.分享给大家供大家参考. ...

  2. springboot应用无故停止运行killed解决方法

    最近使用springboot开发了一个ip代理的程序,今天放到阿里云服务器上运行,多次出现应用运行突然停止的问题. 使用free -h 查看内存使用完全正常.重新运行监视CPU使用也正常.没有出现堆内 ...

  3. SQL SERVER 事务的使用(tran)

    sql server事务的使用是为了确保数据的一致性. 通常写法 begin tran --sql 语句1 --sql 语句2 --sql 语句3 commit tran 上面写法存在隐患,当操作(增 ...

  4. dilated convolutions:扩张卷积

    最近在阅读<Context Encoding for Semantic Segmentation>中看到应用了dilated convolutions. 扩张卷积与普通的卷积相比,除了卷积 ...

  5. html5(七) Web存储

    http://www.cnblogs.com/stoneniqiu/p/4206796.html http://www.cnblogs.com/v10258/p/3700486.html html5中 ...

  6. 使用Python-Libvirt GUI 实现KVM 虚拟机 界面化管理

    一.KVM环境的搭建 1.安装VMware(略) 2.在VMware中安装Linux系统(略,Ubuntu16.04) 打开支持虚拟化 网络选择桥接模式 3.安装qemu apt-get instal ...

  7. ORACLE中使用row_number over()排序

    from:http://blog.csdn.net/iw1210/article/details/11937085 意图:实现select top 1 * from tablename Oracle  ...

  8. sin n次方 x 的降幂公式

    A(n) = ∫ sinⁿx dx= ∫ sinⁿ⁻¹xsinx dx= - ∫ sinⁿ⁻¹x d(cosx)= - sinⁿ⁻¹xcosx + ∫ cosx • d(sinⁿ⁻¹)= - sinⁿ ...

  9. Vue(五) 购物车案例

    这一篇把之前所学的内容做一个总结,实现一个购物车样例,可以增加或者减少购买数量,可移除商品,并且购物车总价随着你的操作实时变化. 实现效果如图: 代码: <!DOCTYPE html> & ...

  10. 【转】Ubuntu英文系统下安装中文输入法

    转自:https://my.oschina.net/No5stranger/blog/290026 ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也的 ...