`
mixer_a
  • 浏览: 343761 次
社区版块
存档分类
最新评论

排序算法第六篇——堆排序

阅读更多

一、优先队列(堆)

优先队列包括两种操作的数据结构,插入和删除最小者。

二叉堆的结逻辑结构是一个完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右排列。

二叉堆的物理结构是一个数组,元素存放从下标为1的位置开始。因为这样子实现的话,对于数组中的某一个位置i的元素,在下标不越界的情况下(也就是说该节点有孩子的情况下),其左孩子在位置2i上,有孩子在2i+1上。

二、插入操作

对于堆的插入操作实现,一般使用的策略上滤(percolate up)策略。上滤操作是只先将要插入的元素插入到最后位置,然后与其父节点比较,如果比父节点还要小,说明该节点放在该位置不符合堆序性质(堆序性质是指一个父节点的值小于两个孩子的值,此时为小堆,如果父节点的值大于两个孩子的值,此时为大堆)。所以将该节点与父节点交换,使符合堆序性质,交换之后,再与新插入元素的父节点比较,知道整个堆符合堆序性质。

三、删除最小者

删除最小者是针对小堆而言的,对小堆来说,最小者始终在根节点,在数组中也就是第一个位置的元素。删除最小者一般使用的策略是下滤(percolate down),下滤是指将根节点删除,然后将最后一个元素的值放到根节点的位置,然后再调整堆,使堆符合堆序性质。

调整堆的过程:

1、先判断其是否有右孩子,如果有右孩子,则必定有左孩子。

判断左右孩子的值是否均大于该节点,如果不是,则与孩子中的最小者交换。以此类推,直到找到结点和合适位置。

2、没有右孩子,只有左孩子

判断右孩子的值是否大于该节点,如果不是,交换两者的位置,以此类推,知道找到结点的合适位置。

3、叶节点,无左右孩子

不用再进行判断,该位置比为该节点的合适位置。

Java源代码如下:


运行结果:

297 35 658 170 208 821 810 732 904 884
建堆过程:
297
35 297
35 297 658
35 170 658 297
35 170 658 297 208
35 170 658 297 208 821
35 170 658 297 208 821 810
35 170 658 297 208 821 810 732
35 170 658 297 208 821 810 732 904
35 170 658 297 208 821 810 732 904 884
排序:
35 170 208 297 658 732 810 821 884 904

分享到:
评论

相关推荐

    程序员实用算法——源码

    第6章 树  6.1 二叉树  6.1.1 树查找  6.1.2 节点插入  6.1.3 节点删除  6.1.4 二叉查找树的性能  6.1.5 AVL树  6.2 红黑树  6.3 伸展树  6.4 B树  6.4.1 保持B树平衡  6.4.2 实现B树算法  ...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,...

    计算机算法分析与设计实验源代码共计五个程序

    变治法在排序问题中的应用——堆排序问题 动态规划法在图问题中的应用——全源最短路径问题 3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    第6章 基本数学问题 154 6.1 判断闰年 154 6.2 多项式计算 156 6.2.1 —维多项式求值 156 6.2.2 二维多项式求值 158 6.2.3 多项式乘法 160 6.2.4 多项式除法 161 6.3 随机数生成算法 164 6.4 复数运算 171 ...

    JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】

    本文实例讲述了JS前端面试必备——基本排序算法原理与实现方法。分享给大家供大家参考,具体如下: 排序算法是面试及笔试中必考点,本文通过动画方式演示,通过实例讲解,最后给出JavaScript版的排序算法 插入排序...

    数据结构与算法分析第二版 ---C语言描述(附加答案)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.4.1 希尔排序的最坏情形分析7.5 堆排序7.5.1 堆排序的分析7.6 归并排序7.6.1 归并排序的分析7.7 快速排序...

    算法导论-麻省理工(中文)

     第六章 堆排序(Heapsort)  第七章 快速排序(Quicksort)  第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构...

    数据结构与算法分析_Java语言描述(第2版)

    第6章 优先队列(堆) 6.1 模型 6.2 一些简单的实现 6.3 二叉堆 6.3.1 结构性质 6.3.2 堆序性质 6.3.3 基本的堆操作 6.3.4 其他的堆操作 6.4 优先队列的应用 6.4.1 选择问题 6.4.2 事件模拟 6.5 d-堆 6.6 左式堆 ...

    数据结构与算法分析

     7.5 堆排序   7.6 归并排序   7.7 快速排序   7.7.1 选取枢纽元   7.7.2 分割策略   7.7.3 小数组   7.7.4 实际的快速排序例程   7.7.5 快速排序的分析   7.7.6 选择问题的线性...

    数据结构与算法分析Java语言描述(第二版)

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    数据结构讲义(严蔚敏版)(含算法源码).rar

    第6章 树和二叉树 27 一、 基础知识和算法 27 1. 树及有关概念 27 2. 二叉树 27 3. 二叉树的性质 27 4. 二叉树的存储结构 28 5. 二叉树的五种基本形态 28 6. 遍历二叉树 29 7. 遍历二叉树的应用 33 8. 线索二叉树 34...

    通俗易懂的啊哈C语言1

    第6节 数据输出――我说咋地就咋地 31 第7节 数据输入――我说算啥就算啥 33 第8节 究竟有多少种小房子 37 第9节 拨开云雾见月明 40 第10节 逻辑挑战1:交换小房子中的数 42 第11节 天啊!这怎么能看懂 45 等等。。...

    数据结构与算法分析_Java语言描述(第2版)]

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    数据结构与算法分析C描述第三版

    第6章 优先队列(堆)   6.1 模型   6.2 一些简单的实现   6.3 二叉堆   6.3.1 结构性质   6.3.2 堆序性质   6.3.3 基本的堆操作   6.3.4 堆的其他操作   6.4 优先队列的应用   6.4.1 ...

    数据结构与算法分析 Java语言描述第2版

    排序7.1 预备知识7.2 插入排序7.2.1 算法7.2.2 插入排序的分析7.3 一些简单排序算法的下界7.4 希尔排序7.5 堆排序7.6 归并排序7.7 快速排序7.7.1 选取枢纽元7.7.2 分割策略7.7.3 小数组7.7.4 实际的快速排序例程...

    严蔚敏 数据结构(C语言版) 代码 23490 书中算法

    第6章 图 126 6.1 图的定义和基本术语 126 6.1.1 图的定义 126 6.1.2 图的基本术语 128 6.2 图的存储结构 129 6.2.1 邻接矩阵 130 6.2.2 邻接表 132 6.3 图的遍历 135 6.3.1 深度优先搜索 135 ...

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    第6章 线性表——链式描述 6.1 单向链表 6.1.1 描述 6.1.2 结构chainNode 6.1.3 类chain 6.1.4 抽象数据类型linearList的扩充 6.1.5 类extendedChain 6.1.6 性能测量 6.2 循环链表和头节点 6.3 双向链表 6.4 链表...

    数据结构习题答案(全部算法)严蔚敏版

    第6章 树 6.1 树的基本概念和术语 6.1.1 树的定义 6.1.2 树的常用术语 6.1.3 树的表示方法 6.2 二叉树 6.2.1 二叉树的定义 6.2.2 二叉树的重要性质 6.2.3 二叉树的存储结构 6.2.4 二叉树二叉链表的一个生成...

Global site tag (gtag.js) - Google Analytics