zoukankan      html  css  js  c++  java
  • 八大排序之堆排序

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

  • 相关阅读:
    第八章 多线程编程
    Linked List Cycle II
    Swap Nodes in Pairs
    Container With Most Water
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock II
    Linked List Cycle
    4Sum
    3Sum
    Integer to Roman
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12937573.html
Copyright © 2011-2022 走看看