python 利用quick sort思路实现median函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)

posted @   bonelee  阅读(1005)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示