堆排序算法

简介:

堆排序(Heap Sort)

  • 概念

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

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

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

spacer.gif

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

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


    spacer.gif

  • 选择排序

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

spacer.gifspacer.gif

  •     堆排序的总结:

     

     时间复杂度:

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

     空间复杂度 :

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

     稳定性:

          不稳定





本文转自 撒旦搞时间 51CTO博客,原文链接:http://blog.51cto.com/12074120/1976138,如需转载请自行联系原作者
相关文章
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
机器学习/深度学习 人工智能 算法
数据结构与算法:堆排序和TOP-K问题
朋友们大家好,本节内容来到堆的应用:堆排序和topk问题
数据结构与算法:堆排序和TOP-K问题
|
2月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
161 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
9月前
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
251 8
算法系列之排序算法-堆排序
|
移动开发 算法 前端开发
前端算法之堆排序
前端算法之堆排序
107 1
|
算法 搜索推荐
算法之堆排序
本文介绍了堆排序算法的原理和实现,通过构建最大堆或最小堆,利用堆的性质进行高效的排序,并提供了具体的编程实现细节和示例。
125 1
算法之堆排序
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
377 0
数据结构与算法学习十八:堆排序
|
算法 Java Go
深入了解堆排序算法
深入了解堆排序算法
247 1
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
158 3
|
人工智能 搜索推荐 算法
sort-04-heap sort 堆排序算法详解
这是一个关于排序算法的系列文章摘要,包括了10篇关于不同排序算法的链接,如冒泡排序、快速排序、选择排序、堆排序等。堆排序是一种基于比较的排序算法,利用了近似完全二叉树的结构并满足最大堆或最小堆的性质。最大堆中,每个节点的值都大于或等于其子节点。文章详细解释了最大堆的概念、节点访问方式以及堆的操作,包括堆调整和堆排序的过程,并通过图解展示了堆排序的具体步骤。此外,还提供了一个Java实现的堆排序代码示例。整个排序系列来源于一个开源项目,读者可以通过链接查看完整内容。
sort-04-heap sort 堆排序算法详解