基本思想:将待排序的序列构成一个大顶堆。此时,最大的值就是堆顶,将它一走,并将余下的序列重新构造成一个堆。如此反复。 ...
分类:
编程语言 时间:
2016-10-17 11:27:53
阅读次数:
206
题目描述:查找数组中最小的k个数。 思路: (1)维护k个元素的最大堆,即用容量为k的最大堆存储最先遍历到的k个数,并假设它们即是最小的k个数,建堆费时O(k)后,有k1<k2<...<kmax(kmax设为大顶堆中最大元素)。继续遍历数列,每次遍历一个元素x,与堆顶元素比较,x<kmax,更新堆( ...
分类:
其他好文 时间:
2016-09-22 01:05:27
阅读次数:
167
堆是完全二叉树 排序之前,首先要建立一个堆,比如给定一个数组[1,3,5,6,2,4,8,6,9],建立二叉树如下: 对排序分为大顶堆和小顶堆 大顶堆:父节点的关键字>=左右孩子节点的关键字 小顶堆:父节点的关键字<=左右孩子节点的关键字 以大顶堆为例,对上述完全二叉树进行堆排序 从最后一个非叶结点 ...
分类:
编程语言 时间:
2016-09-17 12:09:39
阅读次数:
206
包含了Partition函数的多种用法 以及大顶堆操作 ...
分类:
其他好文 时间:
2016-09-01 21:24:48
阅读次数:
133
题目描述:查找最小的k个元素,输入n个整数,输出其中最小的k个。 一般的排序方法,如快排,时间复杂度为O(n*logn+k); 大顶堆方法,时间复杂度为O(k+(n-k)*logk); 如果建立k个元素的最小堆的话,那么其空间复杂度势为O(N),而建立k个元素的最大堆的空间复杂度为O(k); 当面对 ...
分类:
其他好文 时间:
2016-08-28 11:00:37
阅读次数:
495
我觉得我要改一下签名了……怎么会有窝这么啰嗦的人呢? 做这题需要先学习左偏树《左偏树的特点及其应用》 然后做一下POJ3666,这题的简单版。 思路: 考虑一下维护中位数的过程原数组为A,找到的不降数列为B当对于A的前n个数已经找好了最优解B[1…n],可知此时A被分成很多块,并被一些大顶堆记录,假 ...
分类:
其他好文 时间:
2016-08-23 13:04:45
阅读次数:
160
左偏树 炒鸡棒的论文《左偏树的特点及其应用》 虽然题目要求比论文多了一个条件,但是……只需要求非递减就可以AC……数据好弱…… 虽然还没想明白为什么,但是应该觉得应该是这样——求非递减用大顶堆,非递增小顶堆…… 这题和bzoj1367题意差不多,但是那题求的是严格递增。(bzoj找不到那道题,可能是 ...
分类:
其他好文 时间:
2016-08-22 00:27:21
阅读次数:
205
堆排序是对选择排序的改进(时间复杂度和希尔排序一样O(nlog2n)) 数据结构:完全二叉树(大顶堆,根节点都比左右节点大,小顶堆,根节点小于双亲节点) public class HeapSort { public static void main(String[] args) { int a[]= ...
分类:
编程语言 时间:
2016-08-06 17:34:45
阅读次数:
135
#include<stdio.h>//堆排序(大顶堆)
#include<stdlib.h>
#defineMaxSize50
#defineMinSize2
typedefstruct//堆的结构
{
int*nData;//存储堆元素
intnSize;//堆长度
}MyHeap;
//从堆的最后一个结点插入,依次向上(父节点)比较,调整合适位置退出
intInCreas..
分类:
编程语言 时间:
2016-06-27 12:29:12
阅读次数:
151
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:
Key[i]<=key[2i+1]&&Key[i]=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,
满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。
由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字...
分类:
编程语言 时间:
2016-06-24 15:45:04
阅读次数:
187