通常堆是通过一维数组来实现的。在阵列起始位置为0的情况中
(1)父节点i的左子节点在位置(2i+1);
(2)父节点i的右子节点在位置(2i+2);
# (1)最大堆调整(heapify):将堆的末端子节点作调整,使得子节点永远小于父节点。
# (2)建立最大堆(buildMaxHeap):将堆所有数据重新排序。建堆的过程其实就是不断做最大堆调整的过程,从len/2出开始调整,一直比到第一个节点。
# (3) 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算。堆排序是利用建堆和堆调整来进行的。首先先建堆,然后将堆的根节点选出与最后一个节点进行交换,然后将前面len-1个节点继续做堆调整的过程。直到将所有的节点取出,对于n个数我们只需要做n-1次操作。
def heapify(arr, arrLen,root): # 在堆中做结构调整使得父节点root的值大于子节点
left = 2*root + 1
right = 2*root + 2
# arrLen = len(arr)
largest = root
if left < arrLen and arr[left] > arr[largest]:
largest = left
if right < arrLen and arr[right] > arr[largest]:
largest = right
if largest != root:
arr[root], arr[largest] = arr[largest], arr[root]
heapify(arr, largest)
def buildMaxHeap(arr): # 构造一个堆,将堆中所有数据重新排序
for i in range((len(arr)//2),-1,-1):
heapify(arr, len(arr), i)
def HeapSort(arr): # 将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
buildMAXHeap(arr)
for i in range(len(arr)-1,-1,-1):
arr[0],arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
return arr