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


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

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

    下中位数clipboard

    上中位数clipboard[1]

    9.1最大值和最小值

    clipboard[2]

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

    如果同时找max和min 要clipboard[3]

    clipboard[4]: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
    >>> 
    '''
  • 相关阅读:
    JAVA设计模式之桥接模式
    Pycharm新建模板默认添加作者时间等信息
    Handler机制(2)转载
    内部类学习
    设计模式-1依赖倒置原则示例
    正则表达式
    Service原理及例子
    Serializable接口
    设计模式之静态工厂模式
    Handler机制post方法使用
  • 原文地址:https://www.cnblogs.com/liguan/p/5183940.html
Copyright © 2020-2023  润新知