1.调整成为大根堆
#调整成为大根堆 def Max_Heapify(heap,i,length): ''' :param heap: 数组名 :param i: 父节点下标 :param length: 数组中元素个数 ''' lchild=2*i+1 rchild=2*i+2 max=i #递归出口 if i>=length: return False if lchild<length and heap[max]<heap[lchild]: max=lchild if rchild < length and heap[max] < heap[rchild]: max = rchild #此时已经得到了最大元素的下标,接下来进行交换操作 if max!=i: heap[max],heap[i]=heap[i],heap[max] #继续递归 Max_Heapify(heap,max,length)
2.建立一个堆(从最后一个非叶节点开始)
#建立一个堆(从最后一个非叶节点开始) def Build_Heapy(heap): for i in range((len(heap)-1)//2,-1,-1): Max_Heapify(heap,i,len(heap))
3.进行堆排序
#进行堆排序 def Sort_Heapy(heap): #首先是建堆 Build_Heapy(heap) # 不断的将根结点与最后一个结点交换 for i in range (len(heap)-1,-1,-1): heap[0],heap[i]=heap[i],heap[0] #然后重新调整为大根堆 Max_Heapify(heap,0,i)
完整代码如下:
#调整成为成大根堆 def Max_Heapify(heap,i,length): ''' :param heap: 数组名 :param i: 父节点下标 :param length: 数组中元素个数 ''' lchild=2*i+1 rchild=2*i+2 max=i #递归出口 if i>=length: return False if lchild<length and heap[max]<heap[lchild]: max=lchild if rchild < length and heap[max] < heap[rchild]: max = rchild #此时已经得到了最大元素的下标,接下来进行交换操作 if max!=i: heap[max],heap[i]=heap[i],heap[max] #继续递归 Max_Heapify(heap,max,length) #建立一个堆(从最后一个非叶节点开始) def Build_Heapy(heap): for i in range((len(heap)-1)//2,-1,-1): Max_Heapify(heap,i,len(heap)) #进行堆排序 def Sort_Heapy(heap): #首先是建堆 Build_Heapy(heap) # 不断的将根结点与最后一个结点交换 for i in range (len(heap)-1,-1,-1): heap[0],heap[i]=heap[i],heap[0] #然后重新调整为大根堆 Max_Heapify(heap,0,i) if __name__ == '__main__': heap=[8,2,9,1,0,6] Sort_Heapy(heap) print(heap)