《编程之美》2.10 寻找数组中的最大值和最小值

扩展问题自己想的,还没有搜索有没有其它解法...

发现这节就是算法导论9.1嘛...

 

1. [代码]解法一,只会这种估计要被淘汰的...     跳至 [1] [2] [3] [4] [5] [全屏预览] 
#--coding: utf8 --
def find_max_and_min(A):
    min = max = A[0]
    for i in range(1, len(A), 1):
        # 解法一说看成两个独立的问题,分别求,总共比较2N次
        # 其实为啥要把两次比较独立呢,如果大于max就不可能小于min了,这样总比较应该不到2N次
        if A[i] > max:
            max = A[i]
        elif A[i] < min:
            min = A[i]
    return (min, max)

if __name__ == "__main__":
    # A = [1]
    # A = [1, 2]
    A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
    print(find_max_and_min(A)2. [代码]解法二,其实我觉得直接给解法三就好了..     跳至 [1] [2] [3] [4] [5] [全屏预览] 
#--coding: utf8 --
def find_max_and_min(A):
    # N/2次比较
    for i in range(1, len(A), 2):
        if A[i] < A[i-1]: A[i], A[i-1] = A[i-1], A[i]
    # print(A)
    min = max = A[0]
    # N/2次比较
    for i in range(2, len(A), 2):
        if A[i] < min: min = A[i]
    # N/2次比较
    for i in range(1, len(A), 2):
        if A[i] > max: max = A[i]
    return (min, max)

if __name__ == "__main__":
    # A = [1]
    # A = [1, 2]
    A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
    print(find_max_and_min(A)3. [代码]解法三,跟解法二差不多     跳至 [1] [2] [3] [4] [5] [全屏预览] 
#--coding: utf8 --
def find_max_and_min3(A):
    min = max = A[0]
    for i in range(1, len(A), 2):
        # N/2次比较
        if A[i] > A[i-1]:
            t_max = A[i], t_min = A[i-1]
        else:
            t_max = A[i-1], t_min = A[i]
        # N/2次比较
        if t_max > max: max = t_max
        # N/2次比较
        if t_min < min: min = t_min
    return (min, max)4. [代码]解法四,分治方法     跳至 [1] [2] [3] [4] [5] [全屏预览] 
#--coding: utf8 --
def find_max_and_min(A, p, r):
    if r - p <= 1:
        if A[p] < A[r]:
            return (A[p], A[r])
        else:
            return (A[r], A[p])
    # 分解
    q = p + (r - p) / 2
    (lmin, lmax) = find_max_and_min(A, p, q)
    (rmin, rmax) = find_max_and_min(A, q + 1, r)
    # 合并
    return (min(lmin, rmin), max(lmax, rmax))

if __name__ == "__main__":
    # A = [1]
    # A = [1, 2]
    A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
    print(find_max_and_min(A, 0, len(A) - 1))5. [代码]扩展问题,找第二大数     跳至 [1] [2] [3] [4] [5] [全屏预览] 
#--coding: utf8 --
def find_second_max(A, p, r):
    if r - p == 0:
        return (A[p], None)
    elif r - p == 1:
        if A[p] > A[r]:
            return (A[p], A[r])
        else:
            return (A[r], A[p])
    # 分解
    q = p + (r - p) / 2
    (lfmax, lsmax) = find_second_max(A, p, q)
    (rfmax, rsmax) = find_second_max(A, q + 1, r)
    # 合并
    if lfmax > rfmax:
        fmax = lfmax
        smax = max(lsmax, rfmax)
    else:
        fmax = rfmax
        smax = max(rsmax, lfmax)
    return (fmax, smax)

if __name__ == "__main__":
    # A = [1]
    # A = [1, 2]
    A = [7, 2, 2, 4, 5, 15, 3, 5, 8, 10, 11]
    print(find_second_max(A, 0, len(A) - 1))


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值