堆排序算法

堆是一种二叉树结构

大顶堆:任一父节点比子节点大

小顶堆:父节点比任一子节点小

堆的建立过程即使大/小顶堆的构建过程,给定一个数组,首先初始化,再进行堆的调整

建立大顶堆:

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方法

posted @ 2020-08-12 15:18  扁鹊小脑  阅读(165)  评论(0编辑  收藏  举报