堆排序
此算法特性
此算法适用场景
代码实现
def percDown(arr,start_node,end_node): # 堆下沉函数
root_node = start_node
child_node = root_node*2 + 1 # 左子节点
while child_node <= end_node:
if child_node + 1 <=end_node and arr[child_node+1] > arr[child_node]: # 如果右子节点大于左子节点.父节点往比较到大的子节点进行下沉
child_node = child_node + 1
if arr[child_node] > arr[root_node]:
arr[root_node],arr[child_node] = arr[child_node],arr[root_node]
root_node = child_node
child_node = child_node + 1
else:
break
def heap_sort(arr): # 堆排序
father_node_last = len(arr)// 2 - 1 # 最后一个父节点
for father_node_now in range(father_node_last,-1,-1): # 从最后一个父节点开始,到根节点.依次进行下沉.
percDown(arr,father_node_now,len(arr)-1)
for end_node in range(len(arr)-1,0,-1): # 截至条件是end_node>0
arr[0],arr[end_node] = arr[end_node],arr[0] # 根节点与最后一个节点交换元素
percDown(arr,0,end_node-1) # 重新进行下沉.此时是arr[0]需要进行下沉.
return arr
l=[22,3,5,7,23,11]
l = [22,3]
print(heap_sort(l))