算法--分治法寻找中值

问题描述

给定任意一个整数列,寻找这个整数列的中值。

解题思路

由于要用到分治算法,会递归求解,所以推广问题为:寻找一个整数列的第k大的数字。
思路1:将序列排序后再寻找第k大的数字,可以用到快速排序或归并排序。
思路2:使用快速排序的切分思想,将序列切为大于,等于,小于pivot的三个数组,分别叫L,M,R。如果k小于L的长度,那么在L里面递归;如果k大于L+M的长度,在R里面寻找第(k - len(L+M))大的数字。其余情况就是等于pivot,直接return就好。

def selection(arr,k):
    print(arr)
    if len(arr) == 1:                         #当只有一个元素,直接返回
        return arr[0]
    pivot = arr[0]                            #这步以后就是快速排序的切分
    left, right = 1, len(arr)-1
    while left != right:
        while arr[right] >= pivot and left < right:
            right -= 1
        while arr[left] < pivot and left < right:
            left += 1
        if left < right:
            arr[left], arr[right] = arr[right], arr[left]
    arr[0], arr[left] = arr[left], arr[0]

    if k-1 > left:                          #k-1是因为索引从0开始
        return selection(arr[left+1:],k-1-left)
    elif k-1 < left:
        return selection(arr[:left],k)
    else:
        return arr[k-1]

array = [5,1,9,3,7,2,8,10,12,4,6,11]
ans = selection(array,10)
print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值