Java用数组实现堆
来源:互联网 发布:unity3d 画直线 编辑:程序博客网 时间:2024/04/29 13:50
堆:
堆是有如下特点的二叉树:
1、它是完全二叉树,即树的最后一层不要求是满的,第一个空结点开始的结点,左边所有的兄弟结点必须全部不为空,右边所有结点必须全部为空。
2、常常用一个数组来实现。
3、堆中每个结点的关键字都大于等于它的孩子结点的关键字。而左右孩子结点间没有强制规定大小关系。
所以根据3,我们可以知道,堆是一种弱有序的数据结构。
下面用Java实现堆的操作,包括向堆插入结点到堆尾,并进行向上调整,移除堆顶的元素,把堆尾元素移到堆顶并进行调整,更改堆元素的值并进行调整,输出堆中元素等方法。
package test2;class HeapNode{private int key;public HeapNode(int key){this.key = key;}public void setKey(int key){this.key = key;}public int getKey(){return key;}}public class Heap {private HeapNode[] heapArray;private int maxSize;private int currentSize;public Heap(int maxSize){this.maxSize = maxSize;heapArray = new HeapNode[maxSize];currentSize = 0;}public boolean insertNode(int key){if(maxSize == currentSize){return false;}HeapNode newNode = new HeapNode(key);heapArray[currentSize] = newNode;trickleUp(currentSize);//插入在尾端,向上调整,比起插入在根结点向下调整要方便,因为前者只需跟父结点比较,后者要跟两个子结点比较。++currentSize;return true;}public void trickleUp(int index){//插入到堆最末的结点进行向上调整int parentIndex = (index-1)/2;while(parentIndex >= 0){if(heapArray[index].getKey() > heapArray[parentIndex].getKey()){HeapNode temp = heapArray[index];heapArray[index] = heapArray[parentIndex];heapArray[parentIndex] = temp;index = parentIndex;parentIndex = (index-1)/2;//记得对当前值的下标和其父结点的下标更新}else{return;}}return;}public void trickleDown(int index){int leftChild ;int rightChild ;HeapNode temp;while(index < currentSize && index >= 0){leftChild = 2*index + 1;rightChild = 2*index + 2;if(leftChild >= currentSize){//如果左孩子不存在return;}else if(rightChild >= currentSize){//如果左孩子存在,右孩子不存在if(heapArray[leftChild].getKey() > heapArray[index].getKey()){temp = heapArray[index];heapArray[index] = heapArray[leftChild];heapArray[leftChild] = temp;index = leftChild;}}else{//如果左右孩子都存在if(heapArray[leftChild].getKey() > heapArray[rightChild].getKey()){temp = heapArray[index];heapArray[index] = heapArray[leftChild];heapArray[leftChild] = temp;index = leftChild;}else{temp = heapArray[index];heapArray[index] = heapArray[rightChild];heapArray[rightChild] = temp;index = rightChild;}}//end of if-else}//while}//end of methodpublic boolean deleteRootNode(){if(currentSize == 0){return false;}HeapNode root = heapArray[0];//需要时可将其返回heapArray[0] = heapArray[--currentSize];trickleDown(0);//删除根结点后,将最后一个结点放到堆顶,对其向下进行调整;return true;}public boolean changeNodeKey(int index, int newKey){if(index < currentSize && index >= 0){if(heapArray[index].getKey() > newKey){//若新值比当前值小,说明要把新值结点下沉heapArray[index].setKey(newKey);trickleDown(index);}else{//若新值比当前值大,说明要把新值结点上升heapArray[index].setKey(newKey);trickleUp(index);}return true;}return false;}public void displayHeap(){for(int i=0; i<this.currentSize;i++){System.out.print(" "+heapArray[i].getKey());}System.out.println(" ");}}class HeapApp{public static void main(String args[]){Heap heap = new Heap(20);heap.insertNode(1);heap.insertNode(2);heap.insertNode(3);heap.insertNode(9);heap.deleteRootNode();heap.displayHeap();heap.changeNodeKey(2, 8);heap.displayHeap();}}测试结果:
3 1 2 8 1 3
0 0
- Java用数组实现堆
- 堆排序,堆增删操作,Java数组实现堆排序
- JAVA堆算法,基于数组实现
- 数组实现最小堆
- 堆的数组实现
- 数组实现堆
- 堆的数组实现
- 堆排序【数组实现】
- 堆(数组实现)
- 用堆实现优先级队列 Java实现
- 堆数组实现评委评分
- C++ 堆结构(数组实现)
- 堆排序的数组实现
- 数据结构 二叉堆 数组实现
- C++ 堆结构(数组实现)
- 数组实现的堆操作
- C++ 堆结构(数组实现)
- 最小堆的数组实现
- 完美解决.net2.0和.net4.0在同一个iis中共同运行
- DS18B20温度格式转换
- launcher之workspace
- Linux 通用Makefile模板
- Object-C 类,对象,运行时,isa
- Java用数组实现堆
- 例子解析C++的引用,传参,const的相关特点
- IOS开发之----Xcode非ARC项目中设置部分文件ARC支持
- 一些关于Deep Learn方面的资料,牛人主页,资源链接
- Length of the longest substring without repeating characters
- 提高ios代码质量 细节总结1
- 题目 1001 A+B for Matrices 九度Online Judge
- adb push命令
- windows 8.1 无法连接无线网络