BFPRT算法

#在一个数组中,求第K小的数,时间复杂度O(n)
def bfprt(arr, begin, end, i):
    if begin == end :
        return arr[begin]
    pivot = medianofMedians(arr,begin,end)
    pivotRange = partition(arr, begin, end, pivot)
    if(i >= pivotRange[0] and i <= pivotRange[1]):
        return arr[i]
    elif i< pivotRange[0]:
        bfprt(arr, begin, pivotRange[0]-1, i)
    else:
        bfprt(arr, pivotRange[1]+1, end, i)
#中位数组成数组的中位数
def medianofMedians(arr, begin, end):
    num = end - begin + 1
    if num % 5== 0:
        lenx=num//5
    else:
        lenx= num//5 + 1
    newArr=[]
    for i in range(lenx):
        beginI = begin + i*5
        endI = beginI + 4
        newArr.append(getMedian(arr, beginI,min(end, endI)))
    bfprt(newArr,0,lenx-1,lenx//2)
def getMedian(arr, begin, end):
    insertsort(arr, begin, end)
    sumx = begin + end
    mid=sumx//2 + sumx%2
    return arr[mid]
#插入排序
def insertsort(arr, begin, end):
    cur = begin+1
    while(cur <= end):
        j = cur
        while(j>0 and arr[j] < arr[j-1]):
            arr[j],arr[j-1]=arr[j-1],arr[j]
            j-=1
        cur+=1
#相等区域的范围
def partition(arr, L, R, num):
        less = L - 1
        more = R + 1
        while(L < more):
            if arr[L] < num:
                less += 1
                swap(arr, L,less)
                L += 1
            elif arr[L] > num:
                more -= 1
                swap(arr, L, more)
            else:
                L+=1
        return less+1,more-1    
lst = [22,312,22,5,23,7,22]
ans = bfprt(lst,0,6,1)
print(ans)    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值