堆排序(Python实现)

堆排序

  

此算法特性

此算法适用场景




代码实现

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))




参考

posted @ 2020-03-22 13:51  高坦的博客  阅读(253)  评论(0编辑  收藏  举报