zoukankan      html  css  js  c++  java
  • 堆排序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

  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/tianguook/p/5553872.html
Copyright © 2011-2022 走看看