python 利用quick sort思路实现median函数
# import numpy as np def median(arr):
#return np.median(arr)
arr.sort()
return arr[len(arr)>>1] def patition(arr, low, high):
pivot = arr[low]
i = low+1
while i <= high:
if arr[i] > pivot:
arr[i], arr[high] = arr[high], arr[i]
high -= 1
else:
i += 1
arr[high], arr[low] = arr[low], arr[high]
return high def median_helper(arr, low, high, found_index):
pivot_index = patition(arr, low, high)
if pivot_index == found_index:
return arr[found_index]
elif pivot_index > found_index:
return median_helper(arr, low, pivot_index - 1, found_index)
else:
return median_helper(arr, pivot_index + 1, high, found_index) def median2(arr):
assert arr
mid = len(arr)>>1
return median_helper(arr, 0, len(arr) - 1, mid) from random import randint
for j in range(2, 2000):
arr = [randint(0, 2000) for i in range(1, j)]
a = median(list(arr))
b = median2(list(arr))
if a != b:
print(a)
print(b)
print("debug:")
a = median(list(arr))
b = median2(list(arr))
时间复杂度:O(2n)
因为 n+n/2+n/4+.... = 2n
下面这样写也很直观,比我写的跑起来还快些(诡异):
import random
def quick_select(A, k):
#pivot value is random
pivot = random.choice(A) A1 = [] #values < pivot
A2 = [] #values > pivot for i in A:
if i < pivot:
A1.append(i)
elif i > pivot:
A2.append(i)
else:
pass # ignore Pivot value! #case 1: median is in A1
if k <= len(A1):
return quick_select(A1, k)
#case 2: median is in A2
elif k > len(A) - len(A2):
return quick_select(A2, k - (len(A) - len(A2)))
#case 3: median found
else:
return pivot
C=n+n2+n4+n8+…=2n=O(n)
python 利用quick sort思路实现median函数的更多相关文章
- python利用or在列表解析中调用多个函数.py
python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...
- What does Quick Sort look like in Python?
Let's talk about something funny at first. Have you ever implemented the Quick Sort algorithm all by ...
- python学习 -- operator.itemgetter(), list.sort/sorted 以及lambda函数
Python 中有非常方便高效的排序函数,下面主要介绍如何sort/sorted对list,dict进行排序. 1. 用list.sort /sorted 对list of tuples中第二个值进行 ...
- 基础排序算法之快速排序(Quick Sort)
快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...
- 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之VirtualProtect函数
利用Ret2Libc绕过DEP之VirtualProtect函数 ⑴. 原理分析: i.相关概念: VirtualProtect()函数: BOOL WINAPI VirtualProtect( _ ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- [Python] 利用Django进行Web开发系列(二)
1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...
- python中列表和字典常用方法和函数
Python列表函数&方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表 ...
- Python核心编程读笔 10:函数和函数式编程
第11章 函数和函数式编程 一 调用函数 1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...
随机推荐
- bzoj1654 / P2863 [USACO06JAN]牛的舞会The Cow Prom
P2863 [USACO06JAN]牛的舞会The Cow Prom 求点数$>1$的强连通分量数,裸的Tanjan模板. #include<iostream> #include&l ...
- 20145206邹京儒Exp6 信息搜集与漏洞扫描
20145206邹京儒Exp6 信息搜集与漏洞扫描 一.实践过程记录 openvas漏洞扫描 1.openvas-check-setup来查看下他的安装状态: 如下图所示:在步骤7中出现错误,显示需要 ...
- 洛谷 P2056 采花 - 莫队算法
萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成一排的,以 ...
- flash,sram
flash写入的内容不会因电源关闭而失去,读取速度慢,成本较低,一般用作程序存储器或者低速数据读取的情况. sram有最快的读写速度,但电源掉落后其内容也会失去,价格昂贵,一般用作cpu的二级缓存,内 ...
- Android Studio Design界面不显示layout控件的解决方法
发现更改了 layout里面的xml文件后 切换到design后,没有显示控件 解决方法 解决办法: 在 res/values/styles.xml 文件中 将原有的 前面添加 Base. The ...
- NOI 7614 最低通行费(多段图最短路)
http://noi.openjudge.cn/ch0206/7614/ 题意: 有一个N*N的正方形网格,商人从网格的左上角进,右下角出.每穿越中间1个小方格,都要花费1个单位时间.商人必须在(2N ...
- MVC ---- Manager.ttinclude内容
http://www.infoq.com/cn/news/2009/11/T4-Multiple-Output 初次认识并尝试使用T4生成代码的时候,相关学习资料似乎比较少.不过现在VS2010 的M ...
- hdu 1269 迷宫城堡 最简单的联通图题 kosaraju缩点算法
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
- go变量赋初值
package main import "fmt" func variableinitial(){ , var s string="abc" fmt.Print ...
- C++宏定义不受命名空间的约束
// xxx.h namespace A { #define xxx() xxxxx } // 在其他文件中,引入xxx.h文件,使用宏定义时,不需要加命名空间 // yyy.cpp #include ...