zoukankan      html  css  js  c++  java
  • 【算法与数据结构】图说堆排序

     

    1、堆   一棵完全二叉树

         大顶堆:所有非叶子节点元素均不小于其左右子树根节点的值

         小顶堆:所有非叶子节点元素均不大于其左右子树根节点的值

     

    2、 初始化堆

        ①一组无序元素R[0, 1, ..., n - 1], 先按照顺序将该组无序元素构造为一棵完全二叉树

        ②从该二叉树的第一个非叶子结点开始调整,然后调整前一个结点(一定是非叶子结点),依次直到调整完根节点

        ③上一步一遍完成后,再来一遍,直到该完全二叉树符合一个堆的定义为止

     

        测试数据:R[] = {16, 7, 3, 20, 17, 8}, 本组测试数据中,最后一个非叶子结点为值为3的点

       

     

     

     

    3、调整堆

         第二步完成后,二叉树符合一个堆的定义,如下图

        

     

        步骤:

        将符合堆定义的上图中最后一个元素 与 堆顶元素互换, 此时集合 { R[n - 1] }有序, 剩下的无序序列为{ R[0, ..., n - 2] }

        互换后,如果堆顶元素不符合堆的定义,则对齐进行调整:此父结点 与 左右子树根节点中 大的那个 互换, 再调整其他不符合堆定义的元素

        当{ R[0, ..., n - 2] }中元素都符合堆定义的时候,将最后一个元素(即 R[n - 2])与堆顶元素互换, 此时 集合{ R[n - 2], R[n - 1] }有序,

        重复上述过程

        

     

    具体如下

        ①将二叉树的最后一个结点(图中值为3的点) 与 堆顶元素 互换位置, 此时 集合 {20}有序

     

     

      ② 堆顶元素3不符合堆定义,调整

     

     

    ③此时元素3 不符合堆定义, 调整

     

    ④二叉树满足堆的定义后,将无序序列中最后一个元素(这里应该是值为3的元素)  与 堆顶元素 互换

     

     

    ⑤此时的有序序列为 {17, 20}, 此时堆顶元素3不满足堆定义,调整

     

     

    ⑥此时 元素3 不满足堆定义,调整

     

     

    ⑦此时除有序序列{17, 20}以外,其余元素满足堆定义, 将无序序列中最后一个结点(这里是值为3的元素) 与 堆顶元素 互换

     

    ⑧此时 有序序列为{16, 17, 20}, 堆顶元素3不满足堆定义, 调整

     

     

    ⑨此时除有序序列{16, 17, 20}以外,剩余无序序列满足堆定义, 将无序序列中最后一个元素(值为3的元素)  与  堆顶元素 互换

     

    ⑩此时有序序列为 {8, 16,17, 20}, 堆顶元素3不满足堆定义, 调整

     

     

    ⑾此时除有序序列{8, 16, 17, 20}以外, 剩余元素满足堆定义, 将无序序列中最后一个元素(值为3的元素) 与 堆顶 互换

     

    ⑿此时有序序列为{7, 8, 16, 17, 20}, 无序序列中只剩一个元素, 调整完毕,如下

     

     

    完毕。

     

      参考文献:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html  感谢作者

  • 相关阅读:
    Android 中adb 命令(实用)
    Mac安装Scala
    使用阿里云镜像maven管理配置开发环境
    Nginx学习笔记3--Nginx和PHP(fastCGI)的配置和优化
    《实战Nginx》读书笔记--Nginx配置文件
    《实战Nginx》读书笔记
    PHP解码unicode编码中文字符代码
    yii学习笔记--使用gii快速创建控制器和模型
    yii学习笔记--配置文件的配置
    yii学习笔记--快速创建一个项目
  • 原文地址:https://www.cnblogs.com/cuish/p/3906193.html
Copyright © 2011-2022 走看看