假設(shè)堆頂?shù)脑貋碜?a 數(shù)組的 i 位置,那么將堆頂?shù)脑赜胊[i-1]替換,然后從堆的頭部重新調(diào)整堆。如果發(fā)現(xiàn)此時 a 數(shù)組已經(jīng)沒有元素,那么就將堆頂元素與堆尾元素交換,同時令堆的大小減1,仍然是從堆的頭部重新調(diào)整堆。
每次都可得到一個堆頂元素,打印k個堆頂元素,就是最終的結(jié)果。 ?
class Heap:def __init__(self,value,arrNum,index):self.value = valueself.arrNum = arrNumself.index = indexdef printTopk(matrix,k):if matrix == None or len(matrix) == 0:return NoneheapSize = len(matrix)heap = [0 for i in range(heapSize)]for i in range(len(heap)):heap[i] = Heap(matrix[i][index],i,len(heap[i])-1)heapInsert(heap,i)print("Tok " + str(k) + " : ")for i in range(k):if heapSize == 0:breakprint(heap[0].value + " ")if heap[0].index!=0:heap[0].value = matrix[heap[0].arrNum][heap[0].index-1]heap[0].index -=1else:heap[0] = heap[-1]heapSize -= 1heapify(heap,0,heapSize)def heapInsert(heap,index):while parent!=0:parent = int((index-1)/2)if heap[index].value > heap[parent].value:swap(heap,index,parent)index = parentelse:breakdef heapify(heap,index,heapSize):left = 2 * index +1right = 2 * index + 2largest = indexwhile left < heapSize:if heap[left].value > heap[largest].value:largest = leftif right < heapSize and heap[right].value > heap[largest].value:largest = rightif largest != index:swap(heap,largest,index)else:breakindex = largestleft = 2 * index + 1right = 2 * index + 2def swap(heap,index1,index2):tmp = heap[index1]heap[index1] = heap[index2]heap[index2] = tmp