#encoding=utf-8
#此函数一定要从堆的最下层节点开始建堆,如果从堆的最上层开始建堆则无法保证堆的所有节点满足堆结构
def adjustHeap(arr,action_node_index,length):
"""
arr:待排序数组
action_node_index:待调整的堆的节点索引
length:数组的长度即堆的规模
"""
left_child_node_index=2*action_node_index+1
right_child_node_index=2*action_node_index+2
max_node_index=action_node_index
#分别和左右子节点进行比较,找到最大的值对应的index
if left_child_node_index<length and arr[left_child_node_index]>arr[max_node_index]:
max_node_index=left_child_node_index
if right_child_node_index<length and arr[right_child_node_index]>arr[max_node_index]:
max_node_index=right_child_node_index
#如果最大值的索引不是待调整的堆的节点索引,则将最大值放到堆顶
if max_node_index!=action_node_index:
arr[action_node_index],arr[max_node_index]=arr[max_node_index],arr[action_node_index]
#原以最大节点(max_node)为根节点的堆结构由于根节点(max_node)位置发生了变化,
#破坏了原有的堆结构,所以继续调整,直到以最大节点为根节点一下所有堆结构都继续成立
adjustHeap(arr,max_node_index,length)
return arr
def buildHeap(arr):
#先从堆的最后一个非叶子节点开始,进行调整
for i in range(len(arr)//2-1,-1,-1):
adjustHeap(arr,i,len(arr))
return arr
def heapSort(arr):
length=len(arr)
buildHeap(arr)
for i in range(length):
#堆顶的最大值和最后元素交换
arr[0],arr[length-1-i]=arr[length-1-i],arr[0]
#调整堆结构
adjustHeap(arr,0,length-1-i)
return arr
if __name__=="__main__":
arr=[7,3,6,8,10,2,15]
arr1=[5,6,8,3,2,9,15]
print(adjustHeap(arr1,2,len(arr1)))
print(buildHeap(arr))
print(heapSort(arr1))