1. # import numpy as np
  2.  
  3. def median(arr):
  4. #return np.median(arr)
  5. arr.sort()
  6. return arr[len(arr)>>1]
  7.  
  8. def patition(arr, low, high):
  9. pivot = arr[low]
  10. i = low+1
  11. while i <= high:
  12. if arr[i] > pivot:
  13. arr[i], arr[high] = arr[high], arr[i]
  14. high -= 1
  15. else:
  16. i += 1
  17. arr[high], arr[low] = arr[low], arr[high]
  18. return high
  19.  
  20. def median_helper(arr, low, high, found_index):
  21. pivot_index = patition(arr, low, high)
  22. if pivot_index == found_index:
  23. return arr[found_index]
  24. elif pivot_index > found_index:
  25. return median_helper(arr, low, pivot_index - 1, found_index)
  26. else:
  27. return median_helper(arr, pivot_index + 1, high, found_index)
  28.  
  29. def median2(arr):
  30. assert arr
  31. mid = len(arr)>>1
  32. return median_helper(arr, 0, len(arr) - 1, mid)
  33.  
  34. from random import randint
  35. for j in range(2, 2000):
  36. arr = [randint(0, 2000) for i in range(1, j)]
  37. a = median(list(arr))
  38. b = median2(list(arr))
  39. if a != b:
  40. print(a)
  41. print(b)
  42. print("debug:")
  43. a = median(list(arr))
  44. b = median2(list(arr))

时间复杂度:O(2n)

因为 n+n/2+n/4+.... = 2n

下面这样写也很直观,比我写的跑起来还快些(诡异):

  1. import random
  2. def quick_select(A, k):
  3. #pivot value is random
  4. pivot = random.choice(A)
  5.  
  6. A1 = [] #values < pivot
  7. A2 = [] #values > pivot
  8.  
  9. for i in A:
  10. if i < pivot:
  11. A1.append(i)
  12. elif i > pivot:
  13. A2.append(i)
  14. else:
  15. pass # ignore Pivot value!
  16.  
  17. #case 1: median is in A1
  18. if k <= len(A1):
  19. return quick_select(A1, k)
  20. #case 2: median is in A2
  21. elif k > len(A) - len(A2):
  22. return quick_select(A2, k - (len(A) - len(A2)))
  23. #case 3: median found
  24. else:
  25. return pivot

C=n+n2+n4+n8+…=2n=O(n)

python 利用quick sort思路实现median函数的更多相关文章

  1. python利用or在列表解析中调用多个函数.py

    python利用or在列表解析中调用多个函数.py """ python利用or在列表解析中调用多个函数.py 2016年3月15日 05:08:42 codegay & ...

  2. 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 ...

  3. python学习 -- operator.itemgetter(), list.sort/sorted 以及lambda函数

    Python 中有非常方便高效的排序函数,下面主要介绍如何sort/sorted对list,dict进行排序. 1. 用list.sort /sorted 对list of tuples中第二个值进行 ...

  4. 基础排序算法之快速排序(Quick Sort)

    快速排序(Quick Sort)同样是使用了分治法的思想,相比于其他的排序方法,它所用到的空间更少,因为其可以实现原地排序.同时如果随机选取中心枢(pivot),它也是一个随机算法.最重要的是,快速排 ...

  5. 内存保护机制及绕过方法——利用Ret2Libc绕过DEP之VirtualProtect函数

    利用Ret2Libc绕过DEP之VirtualProtect函数 ⑴.  原理分析: i.相关概念: VirtualProtect()函数: BOOL WINAPI VirtualProtect( _ ...

  6. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  7. [Python] 利用Django进行Web开发系列(二)

    1 编写第一个静态页面——Hello world页面 在上一篇博客<[Python] 利用Django进行Web开发系列(一)>中,我们创建了自己的目录mysite. Step1:创建视图 ...

  8. python中列表和字典常用方法和函数

    Python列表函数&方法 Python包含以下函数: 序号 函数 1 cmp(list1, list2)比较两个列表的元素 2 len(list)列表元素个数 3 max(list)返回列表 ...

  9. Python核心编程读笔 10:函数和函数式编程

    第11章 函数和函数式编程 一 调用函数  1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...

随机推荐

  1. js验证两次输入的密码是否一致

    原文链接:http://blog.csdn.net/DDfanL/article/details/51460324

  2. tcp网络通信的三次握手与三次挥手

    背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进程在 ...

  3. 如何Python写一个安卓APP

    前言:用Python写安卓APP肯定不是最好的选择,但是肯定是一个很偷懒的选择,而且实在不想学习Java,再者,就编程而言已经会的就Python与Golang(注:Python,Golang水平都一般 ...

  4. system.data.sqlite的源代码下载

    帮助文档 http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki 历史版本https://system.data.sqlit ...

  5. BZOJ2818: Gcd 欧拉函数

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  6. 瞎折腾之Webhooks

    之前听学长介绍过webhooks,也知道有这个东西,但没有真正的用于项目部署,长久以来一直过着“刀耕火种”的生活......长久以来,都是这么更新代码的: 由于之前做的项目刚刚上线,需要对其进行持续的 ...

  7. 以QQ举例 说明计算机网络中的一些概念区别(TCP与UDP,广播与单播)

    QQ 中的 广播与单播 今天简单地学习了一下 广播和多播(组播) 的知识.关于 单播和多播 的概念,可以用 QQ 中的一些例子来解释. 单播,就像 两个人聊QQ 一样,信息的接收和传递只在两个节点之间 ...

  8. UVa 1347 旅行

    https://vjudge.net/problem/UVA-1347 思路:用d(i,j)表示第一个人走到i,第二个人走到j,还需要走多长的距离.在这里强制定义i>j,并且每次只能走到i+1. ...

  9. HTTP错误 404.17 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理

    Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理   出现这种情况的原因通常是因为先安装了Framewo ...

  10. python 集合从头部删除元素

    num_set = , , , , ]) num_set.pop() print(num_set) num_set.pop() print(num_set)