一个数组可以看成是一棵树。(数组下标0 是根节点 2i+1是节点的左孩子 2i+2是右孩子 ) 这棵树的父亲节点 大于 左右孩子节点 ,称之为大顶堆。 这棵树的父亲节点 小于 左右孩子节点 ,称之为小顶堆。 堆排序 (以大顶堆 为例) 主要分为两个 部分 1>调整节点 2>将无序的数组变成 大顶堆 ...
分类:
编程语言 时间:
2016-03-28 21:52:13
阅读次数:
225
堆排序是一种选择排序,其时间复杂度为O(nlogn)。 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中
分类:
编程语言 时间:
2016-03-03 01:24:10
阅读次数:
255
堆排序是相对其他排序稍微麻烦的排序,是一种利用堆的性质进行的选择排序。堆其实是一棵完全二叉树,只要任何一个非叶节点的关键字不大于或者不小于其左右孩子节点,就可以形成堆。堆分为大顶堆和小顶堆。由上述性质可知大顶堆的堆顶的关键字是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。堆排序同快速排序一样都是不稳定排序。示例代码上传至:https://github.com/chenyufeng1...
分类:
编程语言 时间:
2016-02-03 14:34:40
阅读次数:
215
堆排序是我们熟知的常用的排序算法。 首先先介绍一下什么是堆排序。堆指的并不是我们数据结构上分配内存的堆栈,在这里指的是大顶堆和小顶堆。大顶堆是指根节点数值大于左右孩子节点的完全二叉树,也有可能是满二叉树。总之,就是一颗存贮数值的树。我们可以利用根节点大于孩子节点这一特性对一组数组建立堆,不断取出根节
分类:
编程语言 时间:
2016-01-27 21:21:56
阅读次数:
252
STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆)。注意相同优先级下并没有先进先出,后面的例子中可以看到 头文件#inclu.....
分类:
编程语言 时间:
2016-01-26 21:43:11
阅读次数:
288
什么是堆?http://www.cnblogs.com/mengdd/archive/2012/11/30/2796845.html n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki = k2i 且ki >= k2i+1 (最大化堆或大顶堆) 若将和此...
分类:
编程语言 时间:
2016-01-11 00:13:13
阅读次数:
273
堆排序(Heap Sort)具体步骤为将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆反复第2步。直至所有顶点被输出,序列变成从...
分类:
编程语言 时间:
2016-01-03 22:35:24
阅读次数:
297
1.题目描述翻译过来就是对输入的数字找出其中位数。2.解题思路一开始,我想着这是动态输入,所以必须放弃数组这些静态的数据结构。首先想到了平衡二叉树,然而太麻烦了。后面又想到了大顶堆以及小顶堆,但是不知如何运用,就上这道题discuss瞅了瞅。结果发现了一种double heap解法,十分带感,总体思...
分类:
其他好文 时间:
2015-12-25 22:27:21
阅读次数:
218
这个堆排序是借鉴http://blog.csdn.net/hguisu/article/details/7776068 这个博文所改,首先要感谢博主的精彩分享。简介:堆排序分为两步骤:1、构建一个初始堆(完全二叉树、大顶堆) 2、不断交换堆顶与堆尾的元素,那么堆底的元素都是排好的 3、 调用ad.....
分类:
编程语言 时间:
2015-12-15 15:54:12
阅读次数:
217
1 package tooffer; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 6 public class BigHeap { 7 8 9 10 /* 11...
分类:
编程语言 时间:
2015-11-17 16:34:03
阅读次数:
222