码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序算法

时间:2017-10-25 23:36:26      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:堆排序   python   

堆排序(Heap Sort)

  • 概念

        堆在树中是一个完成二叉树
        堆分为大顶堆和小顶堆
        大顶堆: 非叶子结点的值大于或等于其左右孩子结点
        小顶堆: 非叶子结点的值小于或等于其左右孩子结点
        特征: 堆的根结点的值肯定是极值
  • 堆排序的实现步骤

        构建完全二叉树
        将此完全二叉树调整为堆
        根据堆的特性,使用选择排序
  • 构建完全二叉树:

        待排序数字为30,20,80,40,50,10,60,70,90
        用什么数据类型存储,且如何和完全二叉树的特性构建关联?
            使用列表存储数据,层序遍历完全二叉树,使用完全二叉树的性质5可以知晓
            父结点的索引.
        构造一个列表[0,30,20,80,40,50,10,60,70,90],添0是为了方便控制.

技术分享

  • 调整二叉树为堆(大顶堆):

            从哪开始调整?
                从哪个结点开始?
                    从完全二叉树的最后一个结点的父节点开始
                下一个结点是谁?
                    从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始
                    继续向左逐个查找,直至根结点.
            调整方法?
                根据完全二叉树性质,父节点为n,左孩子结点为n//2,右孩子结点为n//2+1
                首先比较左右孩子结点大小,取得它们最大值,再将父节点与此最大值进行
                比较,从而判断是否调整.


    技术分享

  • 选择排序

        调整好的大顶堆,其根结点是最大值.因此可以使用选择排序,将其极值抓取,
        从而排好序.
        如何选择,怎么处理?
            每次将调整好的大顶堆根结点值,与最后一个叶子结点值交换.并将除最大值
            以外的完全二叉树重新调整为大顶堆.
        每次拿走最大值后的完全二叉树,从哪个结点进行调整?
            此时可以直接从根结点开始调整,由于第一次调整过的原因.

技术分享技术分享

  •     堆排序的总结:

     

     时间复杂度:

          堆排序跟序列开始的顺序无关,因此最差和最好情况都一样.其时间复杂度都为O(nlogn).

     空间复杂度 :

          元素根据索引赋值,其内存空间的大小不变.空间复杂度O(n)

     稳定性:

          不稳定


本文出自 “12064120” 博客,请务必保留此出处http://12074120.blog.51cto.com/12064120/1976138

堆排序算法

标签:堆排序   python   

原文地址:http://12074120.blog.51cto.com/12064120/1976138

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!