用堆排序解决topk问题

topk问题

从一群数中取出前k高或者低的数。(就好比要做一个像csdn热度榜一样的东西)

堆的基础知识:【python】堆排序-CSDN博客

堆排序解决思路

1.先用列表的k个元素构建一个小根堆,小根堆最上面的元素就是最小的元素

2.依次拿列表后面的数与堆顶比较

3.如果大就替换,如果小就下一个

4.最后这个小根堆就是列表中最大的前k个数,全部提出来就可以

小根堆向下调整代码

def sort(li, up, dn):
    '''
    本函数用于堆的向下调整
    :param li:列表
    :param up: 堆顶的数
    :param dn: 列表最右边的数
    :return:
    '''
    i = up  # 定义父节点索引
    c = 2 * i + 1  # 定义子节点索引
    top = li[i]  # 储存最上方的索引
    while c <= dn:  # 如果有子节点
        if c + 1 <= dn and li[c + 1] < li[c]:  # 如果有右子节点而且比左节点小
            c = c + 1  # 把子节点索引定义到右节点
        if li[c] < top:  # 如果子节点小于该节点
            li[i] = li[c]  # 把子节点放到上面
            i = c  # 继续向下看
            c = 2 * i + 1
        else:  # 如果不比子节点小
            li[i] = top  # 直接放到这里
            break
    else:  # 如果没有子节点了
        li[i] = top  # 直接放下
    return li

主代码

def dui_topk(li,k):
    #截取前k个数
    heap=li[0:k]
    #对这k个数构建一个小根堆
    for i in range((k-2)//2,-1,-1):
        sort(heap,0,k-1)
    #后面的数依次带入进行比较
    for i in range(k,len(li)):
        if li[i]>heap[0]:
            heap[0]=li[i]
            sort(heap,0,k-1)
    #挨个出数
    for i in range(k-1,-1,-1):
        heap[i],heap[0]=heap[0],heap[i]
        sort(heap,0,i)
    return heap

结果实例:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北岭敲键盘的荒漠猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值