快速排序的两种实现 -- 种轴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
快速排序的两种实现 -- 种轴partition : 比值partition(更精巧)的更多相关文章
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- 程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题.
1.程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题. 2.可以根据异常寻找问题. 3.可以根据异常寻找问题
- 两款主流项目管理软件PK,哪个更好用?
两款主流项目管理软件PK,哪个更好用? 一.产品介绍 JIRA是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领 ...
- 快速排序的两种实现方法(js)
快速排序的基本思想:通过一趟排序,将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对着两部分记录继续进行排序,以达到整个序列有序的目的.----------- ...
- 【C/C++】快速排序的两种实现思路
方法一:不断填坑,一次确定一个值.http://blog.csdn.net/morewindows/article/details/6684558 #include<stdio.h> vo ...
- 【iOS开发-72】设置状态栏的两种方式、程序生命周期以及更好地理解几大类(对象)之间的关系
(1)设置状态栏的2种方式 --第一种方式就是我们在控制器中设置,系统默认就是交给视图控制器去管理的,这样不同视图控制器能够自己定义不同的状态栏例如以下: -(BOOL)prefersStatusBa ...
- 关于 第三方接口支付的时候 采用post提交的方式,有两种 一种是通过 curl来进行,一种是通过js当页面加载完后跳转
这是第一种.通过javascript页面加载完后,对表单采用 post方式提交给 第三方接口----- echo <<<_END<!DOCTYPE html PUBLIC &q ...
- Java 种15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁等等…
Java 中15种锁的介绍 1,在读很多并发文章中,会提及各种各样的锁,如公平锁,乐观锁,下面是对各种锁的总结归纳: 公平锁/非公平锁 可重入锁/不可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲 ...
- Vue 定义组件模板的七种方式(一般用单文件组件更好)
在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...
随机推荐
- Windows7下安装redmine-3.4.6
Redmine 是一个开源的.基于Web的项目管理和缺陷跟踪工具.Redmine建立在Ruby on Rails(一个用于开发数据库驱动的网络应用程序的完整框架,基于计算机软件语言Ruby,给程序开发 ...
- Learning-Python【19】:Python常用模块(2)—— os、sys、shutil
os模块:与操作系统相关的模块 import os # 获取当前的工作目录 print(os.getcwd()) # 切换工作目录 os.chdir(r'E:\Python\test') print( ...
- robot framework---时间控件取值
项目中遇到日期控件定位不了,网上各种找,并没有适合我的,目前通过Javascript已解决了,再次做个记录,方便自己日后查找,如有同样问题的同学也可以有个参考! 先说明,不同的定位方式是看开发同学如何 ...
- python requests用法总结
requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到.可以说,Requests 完全满足如今网络的需求 本文全部来源于官方文档 http://docs ...
- [Vue]createElement参数
一.createElement 函数模板 // @returns {VNode} createElement( // {String | Object | Function} // 一个 HTML 标 ...
- ml交叉验证
https://blog.csdn.net/guanyuqiu/article/details/86006474 https://blog.csdn.net/weixin_42660173/artic ...
- php同curl post 发送json并返回json数据实例
<?php $arr = array( 'subject'=>'课程', 'loginName'=>'Durriya', 'password'=>'123' ); //json ...
- 菜鸟脱壳之脱壳的基础知识(五)——利用内存断点寻找OEP
经过第一节的基础知识,我们都知道了,加壳程序首先解把原来压缩的代码解压,然后放到所对应的区块中,当外壳程序执行完毕后,跳回到OEP执行,我们都知道,OEP是放在代码段中,也就是当外壳程序处理完毕后,跳 ...
- two week summary
from collections import Iteratorfrom collections import Iterabl dic = {'a':"a","91a&q ...
- css3 二级菜单
<!doctype html><!--<!DOCTYPE> 声明位于文档中的最前面的位置,处于 <html> 标签之前.此标签可告知浏览器文档使用哪种 HTM ...