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

  • 相关阅读:
    mysql常用方法案例
    springboot整合mybatis
    mysql自定义函数统计订单状态:GET_ORDER_STATUS()
    mysql计算时间差-本例为计算分钟差然后/60计算小时保留一位小数,由于直接得小时只会取整
    mysql字段值为null时排序问题
    对象与内存(一)
    java基础提升(关于数组)
    项目的部署
    myeclipse中ssm的搭建
    ui自动化笔记 selenium_webdriver,ui自动化框架(web)
  • 原文地址:https://www.cnblogs.com/King-Tong/p/12937573.html
Copyright © 2011-2022 走看看