码迷,mamicode.com
首页 > 编程语言 > 详细

算法导论 中位数和顺序统计量(python)

时间:2016-02-06 14:21:06      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

第i个顺序统计量:该集合中第i小的元素(建集合排序后第i位 当然算法可以不排序)

中位数:集合中的中点元素

下中位数技术分享

上中位数技术分享

9.1最大值和最小值

技术分享

单独的max或min每个都要扫一遍 n-1次比较

如果同时找max和min 要技术分享

技术分享:1.2个数相互比较 1次{每次选出2个 选n//2次}

2.大的和max比较

3.小的和min比较

找出序列为第i小的数Θ(n)

随机快速排序的运用:(可以回去看快排)

代码:

import random

def PARTTION(A,p,r):
    x = A[r]
    i = p -1
    for j in range(p,r):
        if A[j] <= x:
            i += 1
            A[j],A[i] = A[i],A[j]
    i += 1
    A[r],A[i] = A[i],A[r]
    print(x,A)
    return i

def RANDOMIZED_PARTITION(A,p,r):
    #主元随机化处理
    t = random.randint(p,r)
    A[t],A[r] = A[r],A[t]
    return PARTTION(A,p,r)



def RANDOMIZED_SELECT(A,p,r,i):
    #A 要查找的list
    #p 左边界
    #r 右边界
    #i 值[p,r]中第i位
    if p == r: #只有一位
        return A[p]

    q = RANDOMIZED_PARTITION(A,p,r) #快排关键代码 分成俩半
    k = q - p + 1
    if i == k:
        return A[q]
    elif i < k:
        return RANDOMIZED_SELECT(A,p,q-1,i)
    else:
        return RANDOMIZED_SELECT(A,q+1,r,i-k)


if __name__ == "__main__":
    A = [89, 100, 21, 5, 2, 8, 33, 27, 63]
    print(RANDOMIZED_SELECT(A,0,len(A)-1,2)) #查找第二位

‘‘‘
>>> 
=========== RESTART: F:/python/algorithms/9_3_randomized_select.py ===========
63 [21, 5, 2, 8, 33, 27, 63, 100, 89]
21 [5, 2, 8, 21, 33, 27, 63, 100, 89]
5 [2, 5, 8, 21, 33, 27, 63, 100, 89]
5

win7+python3.5.1
>>> 
‘‘‘

算法导论 中位数和顺序统计量(python)

标签:

原文地址:http://www.cnblogs.com/liguan/p/5183940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!