python实现排序算法NB三人组之堆排序,以及topK问题实现

堆排序

代码如下:

'''
堆排序:
时间复杂度:O(n*logn)
实现较大数据n的topk问题

'''
def sift(li, low, high):
    '''

    :param li: 列表
    :param low: 根节点
    :param high: 最后一个节点
    :return:
    '''
    i = low
    j = 2*i+1 #j是i的左孩子
    temp = li[low] #把堆顶存起来
    while j<=high:  #只要j位置有数
        if j+1<=high and li[j+1]>li[j]:#如果右孩子有并且比左孩子大
            j = j+1 #j指向右孩子
        if li[j]>temp:
            li[i] = li[j] #大的子节点取代父节点的位置
            i = j          #往下走一层
            j = 2*i+1
        else:
            li[i] = temp  #把temp放在某一层领导位置上
            break
    else:
        li[i] = temp     #把temp放在叶子节点上

def heap_sort(li):
    n = len(li)
    for i in range((n-2)//2, -1, -1):
        sift(li, i, n-1)  #建立堆(完全二叉树)

    for i in range(n-1, -1 , -1):#i指向最后一个元素
        li[0], li[i] = li[i], li[0] #将根节点取出,放在最后一个节点位置,即排序
        sift(li, 0, i-1) #对去除根节点的新列表进行sift


'''
TOPk问题:
当n比较大时,取前 k 个数
1.堆排序方法排序比较快: O(nlogk)
2.冒泡,选择排序:kn
3.快排:n*logn
'''
def topk(li, k):
    n = len(li)
    heap = li[0:k]
    for i in range((k-2)//2, -1, -1):
        sift(heap, i, k-1) #建立k个数的堆

    for i in range(k, n):#遍历其它n-k个数与heap[0]比较
        if li[i] < heap[0]:
            heap[0] = li[i]
            sift(heap, 0, k-1)

    for i in range(k-1, -1, -1):
        heap[i], heap[0] = heap[0], heap[i]
        sift(heap, 0, i-1)
    return heap

li=[1, 3, 2, 4, 6, 7, 8, 5]

print(topk(li, 5))
heap_sort(li)
print(li)

结果如下:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值