对排序的实现思路有两种第一种:1.构建最小堆。2.将最小堆的堆顶元素取出放到辅助数组的0号下标。3.重新调整成最小堆(向上调整) 4.重复2-3第二种:1.构建最大堆。2.将堆顶元素(0号)与最后一个元素调换位置。3.最后一个元素不变,剩下的数据调整成最大堆。 4.重复2-3。这里用的是第二种方式。...
分类:
编程语言 时间:
2015-05-27 00:58:17
阅读次数:
140
堆堆:经过排序的完全二叉树,其中任一非叶子节点的值均不大于(或不小于)其左孩子和右孩子结点的值。最大堆和最小堆是二叉堆的两种形式。最大堆:根节点的键值是所有堆结点键值中最大者。最小堆:根节点的键值是所有堆结点键值中最小者。最大-最小堆:集结了他俩的优点。是最大层和最小层交替出现的二叉树,即最大层节点...
分类:
其他好文 时间:
2015-05-26 01:37:39
阅读次数:
222
转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake
先放上题目,出自USACO
题目描述 Description
农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1
农夫John很狡猾。他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他...
分类:
其他好文 时间:
2015-05-23 11:34:54
阅读次数:
261
给出一个整数数组,堆化操作就是把它变成一个最小堆数组。
对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。
样例
给出 [3,2,1,4,5],返回[1,2,3,4,5] 或者任何一个合法的堆数组
挑战
O(n)的时间复杂度完成堆化
说明
什么是堆...
分类:
其他好文 时间:
2015-05-18 20:51:16
阅读次数:
288
问题描述通常在刷题的时候,会遇到最大堆、最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue。具体分析
需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆。那么如何实现最小堆呢?
假设有如下一个struct:struct Node {
int...
分类:
编程语言 时间:
2015-05-14 22:06:43
阅读次数:
317
本文记录了使用C++模板实现了堆的基本操作,对于其他一些有用操作如IncreaseKey和DecreaseKey等则没有实现,这是因为使用模板把最小堆和最大堆揉在一起,对Key的增减我还没有找到比较好的处理方式,而现在写这个堆数据结构主要是因为在Hoffman树算法需要,基本操作已经够用了。
堆是一棵完全二叉树,所谓完全二叉树就是一棵从上倒下,从左到右依次填满每一个位置的二叉树,除了最后一层节点没...
分类:
其他好文 时间:
2015-05-14 16:35:04
阅读次数:
126
最小堆排序先用一个筛的方法形成一个最小堆那什么是最小堆呢?也就是每一个父节点都比它的左右儿子大 如何筛?从最后一个非叶节点开始(也就是最后一个有儿子的节点),先比较它的左右儿子大小,和最大的交换。最小堆形成后 根节点是最大的把根节点和最后一个节点交换 那么最后一个节点就是排完序的最大值 存到数组中然...
分类:
其他好文 时间:
2015-05-13 21:17:28
阅读次数:
111
堆排序是利用堆积树这种数据结构设计的一种算法。
要学习堆排序,我们首先要了解什么是二叉堆:
二叉堆是完全二叉树这这是近似完全二叉树。二叉堆可分为两种形式:最大堆和最小堆。
最大堆的性质是指某个结点的值至多与起父结点的值一样大,最小堆的性质就是指某个节点的值都大于其父结点的值。下图是一个最大堆和一个最小堆。
在堆排序中我们一般使用最大堆。我们要进行堆排序,首先需要把我们的数组转化成一个最大堆...
分类:
编程语言 时间:
2015-05-10 10:01:00
阅读次数:
170
堆排序是利用堆积树这种数据结构设计的一种算法。
要学习堆排序,我们首先要了解什么是二叉堆:
二叉堆是完全二叉树这这是近似完全二叉树。二叉堆可分为两种形式:最大堆和最小堆。
最大堆的性质是指某个结点的值至多与起父结点的值一样大,最小堆的性质就是指某个节点的值都大于其父结点的值。下图是一个最大堆和一个最小堆。
在堆排序中我们一般使用最大堆。我们要进行堆排序,首先需要把我们的数组转化成一...
分类:
编程语言 时间:
2015-05-10 09:44:24
阅读次数:
133
优先队列我们在之前讲过的《堆的基础知识》和《堆排序》之后,我们来讲讲最大堆和最小堆的具体应用优先队列!优先队列基础知识我们来看看这样的场景,给定你一组数据,要你在这组数据里面找到最大的那个数据,你要怎么做?
你可能会说直接遍历一次就行啦,运行时间也就O(n)O(n),但是如果要求你在这堆数据里面找到最大的,然后删除,再在剩下的元素里面找到最大的,那还是要遍历一般所有数据。那有没有其他快速的方法呢?...
分类:
其他好文 时间:
2015-05-07 22:12:26
阅读次数:
204