堆是一种二叉树结构
大顶堆:任一父节点比子节点大
小顶堆:父节点比任一子节点小
堆的建立过程即使大/小顶堆的构建过程,给定一个数组,首先初始化,再进行堆的调整
建立大顶堆:
def buildMaxHeap(arr):
length = len(arr)
for i in range(length//2,-1,-1):
heapify(arr,i,length)
def heapify(arr,i,length):
left = 2*i+1 #左孩子
right= 2*i+2 #右孩子
largest =i
if left < length and arr[left]>arr[largest]:
largest = left
if right < length and arr[right]>arr[largest]:
largest = right
if largest != i:
arr[largest],arr[i] = arr[i],arr[largest]
heapify(arr,largest,length) #由于每次堆顶和堆尾元素置换后会破坏原有的堆结构,保证置换到堆顶的元素能够调整到合适的位置
def heapSort(arr):
length = len(arr)
buildMaxHeap(arr) #构建大顶堆
for i in range(length-1,-1,-1):
arr[0],arr[i] = arr[i],arr[0] #堆顶和末尾元素置换
length-=1
heapify(arr,0,length)
return arr
建立小顶堆:同理大顶堆,只需调整heapify方法