两个方法: 方法1. 利用 STL 中的 multiset (根据结点内的值)自动对指针排序。空间 O(N), 时间 O(NlogN).
方法2. 不利用任何 STL 函数。对指针建堆排序,只需要一个(win32: 4Byte)指针数组即可。空间 : O(K), 时间 O(NlogK)
...
分类:
其他好文 时间:
2014-09-21 17:30:21
阅读次数:
305
个人感觉堆排序还是在排序算法中比较难懂的,看了一段时间。准备把其中的思路理一理。首先,堆分为大根堆和小根堆。堆是满足下列性质的数列{r1, r2, …,rn}: 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。那么如何进行排序呢? 1. 我们要把序列构建为堆,建堆的核心就是不断的调....
分类:
其他好文 时间:
2014-09-07 13:26:55
阅读次数:
205
当N很小十可以使用方法2,
当N很大时可以使用方法1,从硬盘逐次读入解决;
/*方法 1 适合大量数据
*寻找长为N的数组的前M大的元素并输出。
*用堆的性质,使用数组N建立一个M大的最大堆,然后输出堆内容即可
*时间复杂度分析: 建堆时间O(M)
*遍历数字,并在堆中比较时间O((N-M)logM)
*总时间复杂度O(M)+ O((N-M)logM)
*
...
分类:
其他好文 时间:
2014-09-06 11:02:23
阅读次数:
231
C++ STL make_heap, 省去我们自己创建堆的繁琐操作,使用stl库之间进行操作,节省我们大量的时间。...
分类:
其他好文 时间:
2014-09-03 11:18:36
阅读次数:
200
BUILD-MAX-HEAP'(A) heap-size[A]<-1 for i <- 2 to length[A] do MAX-HEAP-INSERT(A, A[i])如上,题目给出一种使用插入的办法建堆的算法,而书中6.4节给出的建堆算法如下:BUILD-MAX-HE...
分类:
其他好文 时间:
2014-08-31 10:25:01
阅读次数:
195
题目:
选择排序法的概念简单,每次从未排序部份选一最小值,插入已排序部份的后端,其时间主要花费于在整个未排序部份寻找最小值,如果能让搜寻最小值的方式加 快,选择排序法的速率也就可以加快
Heap排序法让搜寻的路径由树根至最后一个树叶,而不是整个未排序部份,从而可以加快排序的过程,因而称之为改良的选择排序法。
整个堆排序的过程分建堆、取值、调整为新的堆三个过程。分别如下示:(以最小堆积树为例。关于HeapTree请参阅数据结构与算法)...
分类:
其他好文 时间:
2014-08-21 00:14:23
阅读次数:
193
首先还是要清楚一下堆操作的代码,毕竟线段树打多了,打堆的时候总会往线段树方向靠近首先是建堆:D=1;for(;D>=1,j>>=1){ if(~i&1) ans+=sum[i^1]; if(j&1) ans+=sum[j^1]; } return ans;}更新操作:void update(int ...
分类:
其他好文 时间:
2014-08-09 18:15:18
阅读次数:
257
堆-顾名思义,上面小,下面大,或者上面大,下面小。在堆排序过程中,首先应该建堆。如何将数组中的元素建立成一个规范的堆行结构。二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最...
分类:
其他好文 时间:
2014-07-26 00:07:16
阅读次数:
381
先看下堆的概念:堆是一种数据结构,逻辑上是一种完全的二叉树,在存储上是数组对象。
堆分为小顶堆和大顶堆,顾名思义:小顶堆是指顶部的元素是最小的,大顶堆是指顶部的元素师最大的。
这样只要我们能够得到这样的堆,每次将顶部的元素和数列的最后一个元素进行交换,然后再对剩下的元素进行建堆,接着以此类推这样的做法,便可以得到排好的数列了。
根据上面所述,堆排序的关键是:建堆。建堆也分为调堆和建堆过程;...
分类:
其他好文 时间:
2014-07-19 02:47:16
阅读次数:
213
解题思路:
有m行,每行n个数,从每行中取出一个数相加一起求出sum,这样的sum有n的m次方个。要求的前n个最小的sum值。
第一次使用STL里面的堆,一开始对pop_heap()有点不太理解,后来明白了,比如对数组heap[n],最大下标为n-1建堆,默认的是建立大顶堆,heap[0]是数组中最大的数,写一条pop_heap()语句,就是把heap[0]和
heap[n...
分类:
其他好文 时间:
2014-07-18 14:11:34
阅读次数:
281