堆与优先级队列

简介:
最大值堆(MAX-HEAP)的性质是任意一个结点的值都大于或者等于其任意一个子结点存储的值。由于根结点包含大于或等于其子结点的值,而其子结点又依次大于或者等于各自结点的值,所以根结点存储着该树的所有结点中的最大值。

最小值堆(MIN-HEAP)的性质是任意一个结点的值都小于或者等于其子结点存储的值。

无论最小值堆还是最大值堆,任何一个结点与其兄弟之间都没有必然的联系。

public class MaxHeap {

private Element[] heap;

private int maxSize;

private int size;

public MaxHeap(Element[] heap, int size, int maxSize) {
this.heap = heap;
this.size = size;
this.maxSize = maxSize;
}

public int size() {
return this.size;
}

public boolean isLeaf(int position) {
return (position >= size / 2) && (position < size);
}

public int leftChild(int position) {
return 2 * position + 1;
}

public int rightChild(int position) {
return 2 * position + 2;
}

public int parent(int position) {
return (position - 1) / 2;
}

public void buildheap() {
for (int i = size / 2; i >= 0; i--) {
siftdown(i);
}
}

private void siftdown(int position) {
while (!isLeaf(position)) {
int j = leftChild(position);
if ((j < (size - 1)) && (heap[j].getKey() < heap[j + 1].getKey())) {
j++;
}
if (heap[j].key >= heap[j + 1].getKey()) {
return;
}
swap(position, j);
position = j;
}
}

public void insert(Element element) {
int position = size++;
heap[position] = element;
while ((position != 0)
&& (heap[position].getKey() > heap[parent(position)].getKey())) {
swap(position, parent(position));
position = parent(position);
}
}

public Object removeMax() {
return remove(0);
}

public Object remove(int position) {
swap(position, --size);
if (size != 0) {
siftdown(position);
}
return heap[size];
}

private void swap(int src, int dest) {
Element element = heap[src];
heap[src] = heap[dest];
heap[dest] = element;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

}

public class Element {
private Object value;

private int key;

public Element() {

}

public int getKey() {
return key;
}

public void setKey(int key) {
this.key = key;
}

public Object getValue() {
return value;
}

public void setValue(Object value) {
this.value = value;
}

}
}
专注于企业信息化,最近对股票数据分析较为感兴趣,可免费分享股票个股主力资金实时变化趋势分析工具,股票交流QQ群:457394862
分类: C/C++

本文转自沧海-重庆博客园博客,原文链接:http://www.cnblogs.com/omygod/archive/2006/11/08/554627.html,如需转载请自行联系原作者
目录
相关文章
|
6月前
堆(优先级队列 PriorityQueue)
堆(优先级队列 PriorityQueue)
40 0
|
存储 安全 Java
数据结构优先级队列(堆)
数据结构优先级队列(堆)
81 1
|
2月前
|
存储 Java
【数据结构】优先级队列(堆)从实现到应用详解
本文介绍了优先级队列的概念及其底层数据结构——堆。优先级队列根据元素的优先级而非插入顺序进行出队操作。JDK1.8中的`PriorityQueue`使用堆实现,堆分为大根堆和小根堆。大根堆中每个节点的值都不小于其子节点的值,小根堆则相反。文章详细讲解了如何通过数组模拟实现堆,并提供了创建、插入、删除以及获取堆顶元素的具体步骤。此外,还介绍了堆排序及解决Top K问题的应用,并展示了Java中`PriorityQueue`的基本用法和注意事项。
50 5
【数据结构】优先级队列(堆)从实现到应用详解
|
6月前
|
存储 Java
优先级队列(堆)
优先级队列(堆)
45 3
|
6月前
|
存储 安全
堆与优先级队列
堆与优先级队列
37 0
|
6月前
|
存储 算法 安全
堆 和 优先级队列(超详细讲解,就怕你学不会)
堆 和 优先级队列(超详细讲解,就怕你学不会)
|
6月前
|
存储 算法
什么是堆,优先级队列的模拟实现
什么是堆,优先级队列的模拟实现
42 0
|
存储 算法
优先级队列(堆)&&  堆排序
优先级队列(堆)&&  堆排序
48 0
|
存储 Java
基于堆的优先级队列
java自带的优先级队列默认是小顶堆,现在来写一个大顶堆的
84 0
|
存储 安全 Java
【数据结构趣味多】优先级队列——堆
【数据结构趣味多】优先级队列——堆