认识堆是从堆排序开始的
二叉堆是完全二叉树或者是近似完全二叉树,堆存储在数组中:
根结点下标为0时,下标为n的元素的子结点下标分别为2*n+1,2*n+2,其父结点下标为(n-1)/2
二叉堆的特性:
1、父结点的键值总是>=(
2、每个结点的左右子树都是二叉堆
当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。
当父结点的键值总是小于或...
分类:
编程语言 时间:
2014-11-04 17:35:16
阅读次数:
262
(一) 堆排序:由于优先队列可以花费O(NlogN)时间的排序,基于该想法的排序称之为堆排序。建立N个元素的二叉堆,基本上花费的时间为O(N),再执行N次删除操作。按照顺序呢,最小的元素先离开该堆。通过将这些元素...
分类:
编程语言 时间:
2014-11-03 14:45:36
阅读次数:
301
一 堆 堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树种每个节点与数组中的存放该节点值的那个元素对应。所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示:二叉堆可以分为两种形式:最大堆和最小堆。在这两种堆中,结点的值都要满足堆的性质。在最大堆...
分类:
编程语言 时间:
2014-11-02 20:51:42
阅读次数:
244
堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先解说下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是全然二叉树或者是近似全然二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值。2.每一个结点的左子树和右...
分类:
编程语言 时间:
2014-11-01 13:11:20
阅读次数:
187
/*
** 二叉堆的实现
** 堆最重要的性质是儿子的值大于等于父亲的值,除此之外,
** 树的节点是按照从上到下,从左到右的顺序紧凑排列的。
**
** 插入:首先在末尾插入,然后不断向上提升直到没有大小颠倒为止。
** 删除:首先把堆的最后一个元素复制到根节点并且删除最后一个
** 节点。然后不断向下交换直到没有大小颠倒为止。在向下交换过程
** 中,如果有两个儿子,那么选择数值较小的儿子...
分类:
其他好文 时间:
2014-10-31 17:18:17
阅读次数:
194
堆排序,就是利用二叉堆的特性来完成排序的工作。这里假定我们要完成对一个数组进行从小到大排序的工作,那么利用最小堆(见《二叉堆 - 最小堆》)的特性,对于一个已经建好的最小堆,我们每次以DeleteMin函数取出最小的元素,放入一个临时数组中,如此一来,就完成了对该数组的排序。时间复杂度的话,建立堆的...
分类:
编程语言 时间:
2014-10-29 18:42:11
阅读次数:
164
与上篇《二叉堆 - 最小堆》类似,只不过堆序(heap order)从内部节点小于左右子节点变成了内部节点大于左右子节点。代码如下: 1 #include 2 #include 3 4 #define MIN (1items =(Item*)malloc((maxItems+1)*si...
分类:
其他好文 时间:
2014-10-29 16:32:17
阅读次数:
270
二叉堆:一般我们拿来用的就是最大堆和最小堆。最小堆:每个节点的值比它的左右子节点的值要大。代码实现如下:参考Mark Allen Weiss《数据结构和算法分析》(第二版) 1 #include 2 #include 3 4 #define MIN (1items =(Item*)ma...
分类:
其他好文 时间:
2014-10-28 23:55:06
阅读次数:
997
改造二叉树【题目描述】小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的...
分类:
其他好文 时间:
2014-10-26 16:53:12
阅读次数:
163
堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先解说下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是全然二叉树或者是近似全然二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)不论什么一个子节点的键值。2.每一个结点的左子树和右...
分类:
编程语言 时间:
2014-10-22 20:16:05
阅读次数:
228