大根堆

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 16 11:56:42 2021

@author: xiangsong
"""

# heap 排序求最大的k个数
class Solution:
    def GetLeastNumbers_solution(self, tininput, k):
        # 建立一个大小为k的堆
        heap = [0] * (k)
        
        # 初始化堆数据
        for i in range(k):
            heap[i] = tininput[i]
            
        # 建立k大小的大根堆  从0-k调整元素
        for i in range(k):
            self.heapInsert(heap, i)
            
        arr = []
        heapSize = len(heap)
        #其余元素index
        l = k
        
        # 将较大的值 放到堆里面去
        while l<len(tininput):
            if heap[0] < tininput[l]:
                heap[0] = tininput[l]
                self.heapify(heap, 0, heapSize)
            l+=1
        # 知道tininput的其他元素和堆顶比较过, 此时堆就是由最大的k个数构成的大顶堆
        
        #取出堆值!!! 直到堆为空
        while heapSize>0:
            arr.append(heap[0])
            self.swap(heap, 0, heapSize)
            heapSize -= 1
            # 堆顶下沉
            self.heapify(heap,0, heapSize)
        
        
    def heapInsert(self, heap, index):
        '''
        堆底元素上浮!
        '''
        while heap[index] >heap[(index-1) / 2]:
            self.swap(heap,index, (index-1) / 2)
            index =  (index-1) / 2
            
    def heapify(self, heap,index,  heapSize):
        '''
        堆顶元素下沉!
        '''
        left = 1
        while left < heapSize:
            # 找到自己和左右节点中最大的那个元素的索引
            largest = left+1 if left+1 < heapSize and heap[left+1] >heap[left] else left
            largest = index if heap[largest] < heap[index] else largest
            if largest == index:# 最大的为自己,那么就不用下沉了
                break
            # 否则 继续下沉
            self.swap(heap, largest, index)
            #更新下浮节点索引
            index = largest
            #更新孩子索引
            left = index * 2 + 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值