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

  • 相关阅读:
    kafka概述
    Spark网络通信分析
    spark序列化及MapOutputTracker解析
    spark checkpoint详解
    深入理解spark streaming
    spark Listener和metrics实现分析
    Spark SQL catalyst概述和SQL Parser的具体实现
    spark block读写流程分析
    java 分布式实践
    单元测试ppt
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12937573.html
Copyright © 2011-2022 走看看