• 堆排序Heap sort


    堆排序有点小复杂,分成三块

    第一块,什么是堆,什么是最大堆

    第二块,怎么将堆调整为最大堆,这部分是重点

    第三块,堆排序介绍


    第一块,什么是堆,什么是最大堆

    什么是堆

    这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构。

    堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素.

    数组与堆之间的关系

    Heap1

    二叉堆一般分为两种:最大堆和最小堆。

    什么是最大堆

    堆中每个父节点的元素值都大于等于其孩子结点(如果存在),这样的堆就是一个最大堆

    因此,最大堆中的最大元素值出现在根结点(堆顶)

    节点与数组索引关系

    对于给定的某个结点的下标i,可以很容易的计算出这个结点的父结点、孩子结点的下标,而且计算公式很漂亮很简约

    Image(2)

    第二块,怎么将堆调整为最大堆,这部分是重点

    整个过程如下图所示

    在4,14,7这个小堆里边,父节点4小于左孩子14,所以两者交换

    在4,2,8这个小堆里边,父节点4小于右孩子8,所以两者交换

    Heap3

    上图展示了一趟调整的过程,这个过程递归实现,直到调整为最大堆为止

    第三块,堆排序介绍

    堆排序就是把堆顶的最大数取出,

    将剩余的堆继续调整为最大堆,具体过程在第二块有介绍,以递归实现

    剩余部分调整为最大堆后,再次将堆顶的最大数取出,再将剩余部分调整为最大堆,这个过程持续到剩余数只有一个时结束

    下边三张图详细描述了整个过程

    Heap4

    Heap5

    Heap6

    参考文章

    http://www.cnblogs.com/kkun/archive/2011/11/23/2260286.html

  • 相关阅读:
    问题 L: Robots
    最强阵容
    [学习][Math]康托展开和逆康托展开
    [学习][STL]next_permutation
    [动态规划][数位dp]F(x)
    [动态规划][数位dp]Bomb
    [动态规划][数位dp]不要62
    [动态规划][树形dp]Bichrome Tree
    [思维]Finite Encyclopedia of Integer Sequences
    [二分答案]gpa
  • 原文地址:https://www.cnblogs.com/tianguook/p/5553872.html
Copyright © 2020-2023  润新知