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

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

 
阅读更多

一、优先队列(堆)

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

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

二叉堆的物理结构是一个数组,元素存放从下标为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

分享到:
评论

相关推荐

    (陈慧南 第3版)算法设计与分析——课后习题答案(1~8章)

    6. **第六章:动态规划** 动态规划是一种强大的解决问题的方法,用于处理具有重叠子问题和最优子结构的问题。本章讲解了背包问题、最长公共子序列、矩阵链乘法等问题的动态规划解法。 7. **第七章:贪心算法** ...

    最快的排序算法 图解八大排序算法——我见过的最详细的讲解(转),排序算法数据结构

    选择排序是一种简单的排序算法,思路是选择数组中的最小元素,和第一个元素交换,然后在剩下的元素中选择最小元素,和第二个元素交换,以此类推,直到排序完成。时间复杂度为 O(n^2),空间复杂度为 O(1)。Java 代码...

    用C语言实现常用排序算法

    本项目旨在实现并比较六种经典的排序算法——直接插入排序、折半插入排序、起泡排序、简单选择排序、堆排序以及2-路归并排序,使用C语言编程。为了全面评估这些算法,我们将在一组随机生成的30000个整数上运行它们,...

    8种排序算法(选择排序 冒泡排序 快速排序等~)

    堆排序利用了数据结构——二叉堆(最大堆或最小堆)来实现排序。首先将待排序序列构造成一个大顶堆或小顶堆,然后将堆顶元素与末尾元素交换,接着调整剩余元素重新构成堆,再将堆顶元素与末尾元素交换,如此反复,...

    算法与数据结构——C语言描述(第2版)电子教案-作者+张乃孝

    6. **第6章 集合与字典**:集合和字典提供了快速查找和存储元素的能力。本章会讲解哈希表、符号表等实现,以及在C语言中如何高效地实现这些数据结构。 7. **第7章 高级字典结构**:这章可能深入讨论字典结构的高级...

    高教类课件:算法与数据结构——C语言描述(第2版).zip

    4. **排序与搜索算法**:排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)和搜索算法(线性搜索、二分搜索、哈希搜索等)是算法中的重要组成部分,课程会详细讲解它们的工作原理和效率比较...

    java对数组实现选择排序(csdn)————程序.pdf

    选择排序是一种简单直观的排序算法,它的...在实际开发中,人们通常会选择效率更高的排序算法,如快速排序、归并排序或堆排序。然而,了解并理解基本的排序算法如选择排序,对于学习和掌握更复杂的算法是非常有帮助的。

    面试求职必会算法——树和堆

    本篇将深入探讨“面试求职必会算法——树和堆”。 首先,树是一种非线性的数据结构,由节点(或称为顶点)和边组成,每个节点可以有零个或多个子节点。树的基本术语包括根节点、叶节点、父节点、子节点、兄弟节点等...

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

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

    排序算法-基于C语言实现的排序算法之BubbleSort实现.zip

    本项目重点介绍了一种经典的排序算法——冒泡排序(Bubble Sort),并提供了C语言的实现。 冒泡排序是一种简单直观的排序方法,它的基本思想是通过重复遍历待排序的序列,一次比较两个元素,如果它们的顺序错误就把...

    程序员实用算法——源码

    第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树算法  ...

    算法导论——教师手册

    第6章:堆排序** - **主题简介**:讲解基于堆的数据结构以及如何利用堆进行排序。 - **关键知识点**: - 堆的定义及其性质 - 构建最大堆的方法 - 堆排序算法的实现 - **应用场景**:适用于需要对大量数据进行...

    第03章 方法与数组 08 选择排序算法

    在编程领域,排序算法是数据结构与算法学习中的重要组成部分,它主要用于对一系列元素进行排列。...在实际开发中,根据具体需求和数据规模,我们通常会选择更高效的排序算法,如归并排序、快速排序或堆排序等。

    Python语言程序设计课教程 中英双语课件 Python中的1ADS算法-6-排序算法 共118页.pptx

    **Python语言程序设计课教程——1ADS算法与排序算法** 排序算法是计算机科学中的核心概念,特别是在编程语言如Python中,它们对于数据处理和分析至关重要。1ADS算法(可能是指"1st Approach to Data Structures",...

    各大排序算法视频及源码资源--第一部分

    本资源包——"各大排序算法视频及源码资源--第一部分",提供了全面的学习材料,包括视频讲解、动画演示、源代码以及经典例题,帮助你深入理解和掌握各种排序算法。 首先,我们来探讨排序算法的基本概念。排序是将一...

    堆排序实现c++代码和介绍实例

    堆排序是一种基于比较的排序算法,它利用了一种特殊的完全二叉树结构——堆。堆是一种近似完全二叉树的数据结构,其中每个父节点的键值要么大于(大根堆)要么小于(小根堆)它的子节点的键值。堆排序通过构建和调整...

    七大排序算法

    根据给定文件的信息,我们可以总结出七大排序算法的相关知识点,包括插入排序、冒泡排序、选择排序、快速排序、归并排序、基数排序以及堆排序。 ### 一、插入排序 **定义:** 插入排序是一种简单的排序算法,通过...

    算法导论——习题解答

    6. **第六章:快速排序** - **Lecture Notes**:快速排序是一种非常高效的排序算法,其核心思想是通过分治法来解决问题。本章将介绍快速排序的原理和具体实现。 - **Solutions**:通过实例讲解快速排序的执行过程...

    数据结构与算法分析——C++语言描述第三版习题答案

    ### 数据结构与算法分析——C++语言描述第三版习题答案 #### 一、书籍概述 本书是由Mark Allen Weiss编写的《数据结构与算法分析——C++描述 第3版》的课后习题答案集。这是一本针对计算机科学领域的经典教材之一...

    排序算法c&java描述

    6. 堆排序:通过构建最大(或最小)堆来实现排序,堆是一种近似完全二叉树的结构,具有堆性质。C语言中,可以手动维护堆结构;Java中,可以直接使用PriorityQueue或TreeSet。 这些排序算法各有优缺点,如冒泡和选择...

Global site tag (gtag.js) - Google Analytics