python堆排序及其应用

1、建立最大堆,根据最大堆将数组从小到大排序

#建立最大堆,是从小到大排序,建立最小堆,是从大到小排序;平均时间复杂度O(nlogn)
def heap_adjust(A,i,size):    #将i位置以下调整成最大堆
    left = 2*i + 1
    right = 2*i + 2
    max_pos = i
    if left < size and A[max_pos] < A[left]:#将i和其左右孩子将最大的地址存到max_pos
        max_pos = left
    if right < size and A[max_pos] < A[right]:
        max_pos = right
    if max_pos != i:
        tmp = A[max_pos]
        A[max_pos] = A[i]
        A[i] = tmp
        heap_adjust(A,max_pos,size)

def heap_build(A,size):        #建立最大堆建堆从最后倒数第一个非叶子节点开始调整
    for i in range(int(size/2),-1,-1):
        heap_adjust(A,i,size)
    return A

def heap_sorting(A):          #利用最大堆排序
    size=len(A)
    heap_build(A,size)
    for i in range(len(A)-1,0,-1):
        tmp = A[i]
        A[i] = A[0]
        A[0] = tmp
        heap_adjust(A,0,i)
    return A

2、取数组arr中最大的k个数

#平均时间复杂度O(nlogk)
def heap_adjust(A,i, size):   #建立k个数的最小堆
    left = 2*i + 1
    right = 2*i + 2
    min_pos = i
    if left < size and A[min_pos] > A[left]:
        min_pos = left
    if right < size and A[min_pos] > A[right]:
        min_pos = right
    if min_pos != i:
        tmp = A[min_pos]
        A[min_pos] = A[i]
        A[i] = tmp
        heap_adjust(A,min_pos,size)
def heap_build(A,size):
    for i in range(int(size/2),-1,-1):
        heap_adjust(A,i,size)
    return A

def heap_maxk(A,k,size):  #取最大的k个数
    B = heap_build(A[:k],k)
    for i in range(k,size):
        if A[i] > B[0]:
            B[0] = A[i]
            heap_adjust(B,0,k)
    return B

3、找出数组中第k大的数

#平均时间复杂度O(nlogk)
def heap_adjust(A,i, size):   #建立k个数的最小堆
    left = 2*i + 1
    right = 2*i + 2
    min_pos = i
    if left < size and A[min_pos] > A[left]:
        min_pos = left
    if right < size and A[min_pos] > A[right]:
        min_pos = right
    if min_pos != i:
        tmp = A[min_pos]
        A[min_pos] = A[i]
        A[i] = tmp
        heap_adjust(A,min_pos,size)
def heap_build(A,size):
    for i in range(int(size/2),-1,-1):
        heap_adjust(A,i,size)
    return A

def heap_maxk(A,k,size):     #取第k大的数
    B = heap_build(A[:k],k)
    for i in range(k,size):
        if A[i] > B[0]:
            B[0] = A[i]
            heap_adjust(B,0,k)
    return B[0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值