java堆算法之插入与删除
来源:互联网 发布:中电四公司知乎 编辑:程序博客网 时间:2024/06/05 08:29
package com.htsc.heap;import java.util.Arrays;public class Heap{ //堆容量 int maxSize; //当前索引 int currentIndex; //使用数组来维护堆中节点 Node[] nodeArr; public Heap() { super(); } public Heap(int maxSize) { super(); this.maxSize = maxSize; this.currentIndex = 0; this.nodeArr = new Node[maxSize]; } public Node[] getNodeArr() { return nodeArr; } public void setNodeArr(Node[] nodeArr) { this.nodeArr = nodeArr; } public int getMaxSize() { return maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } //插入 //1.将新插入的元素,放置到队列的尾部。 //2.若该元素大于其父节点,两个元素互换。(上移操作) //3.循环第2步,直至该元素没有父节点或小于其父节点。 public boolean add(int value){ int index; //当前节点父索引 if(currentIndex == 0){ nodeArr[currentIndex++] = new Node(value); return true; }else{ nodeArr[currentIndex++] = new Node(value); index = currentIndex - 1; //堆化 while(nodeArr.length > 1){ int sData = nodeArr[index].getData(); int pData = nodeArr[(index - 1) / 2].getData(); if(sData > pData){ nodeArr[index].setData(pData); nodeArr[(index - 1) / 2].setData(sData); } index = (index - 1) / 2; if(index == 0){ break; } } } return true; } //删除 //1.移掉顶部的节点。 //2.将队末的元素放置到顶部。 //3.该节点与其子节点中较大的那个比较,若小于它,则交换位置,(下移操作) //4.循环第3步,直到叶节点或不再比其子节点中较大那个小。 public boolean delete(int index){ int length = nodeArr.length; nodeArr[index].setData(nodeArr[length - 1].getData()); length = length - 1; nodeArr = Arrays.copyOf(nodeArr, length); while(length > 1){ int pValue = nodeArr[index].getData(); if(2*index + 1 <= length - 1 && nodeArr[2*index + 1].getData() > pValue){ nodeArr[index].setData(nodeArr[2*index + 1].getData()); nodeArr[2*index + 1].setData(pValue); index = 2*index + 1; }else if(2*index + 2 <= length - 1 && nodeArr[2*index + 2].getData() > pValue){ nodeArr[index].setData(nodeArr[2*index + 2].getData()); nodeArr[2*index + 2].setData(pValue); index = 2*index + 2; }else{ break; } } return true; } public String show(){ StringBuffer buffer = new StringBuffer("{"); for(int i = 0; i < nodeArr.length - 1; i++){ buffer.append(i+"-"+nodeArr[i].getData()+"|"); } buffer.append("}"); buffer.substring(0, buffer.length()-1); return buffer.toString(); }}class Node{ //数据 int data; public Node() { super(); } public Node(int data) { super(); this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } }
阅读全文
0 0
- java堆算法之插入与删除
- 优先队列即堆:插入算法与删除算法JAVA
- Java与算法之(8) - 堆排序
- 最大最小堆的插入与删除
- 【数据结构】最大堆的插入与删除
- Java-最大堆的排序,插入,删除
- Java数据结构与算法之插入排序
- 单链表插入与删除算法
- java实现堆的操作(建堆,插入,删除)
- 堆插入、删除、排序
- 堆排序,插入,删除,调整算法(大顶堆)
- 堆排序,插入,删除,调整算法(大顶堆)
- 堆的插入与删除,上浮与下沉
- 堆与堆排序、二叉堆定义、对的插入与删除
- 堆与堆排序、二叉堆定义、对的插入与删除
- 经典算法之堆与堆排序
- 常用算法之堆排原理介绍与java实践
- Java之常见的几种排序算法-插入、选择、冒泡、快排、堆排等 .
- sqlserver安装出错:无法为此请求检索数据。
- 潮光光耦网分享简单易懂的专业光耦知识
- vim里面tab每次四个空格
- 工作记录--android 分线程, 录音
- 关于Idea软件 Maven项目 MyBatista案例单测的错误
- java堆算法之插入与删除
- SpringMVC之表单标签
- 基于javascript用olamisdk实现web端语音识别语义理解(speex压缩)
- java中mongodb使用
- 流控制RTS/CTS/DTR/DSR
- quartz定时任务时间设置
- linux系统post-commit hook failed (exit code 255) with no output的终极解决方案
- JavaSE实战——jdk配置,数组及其应用,栈和堆内存图解
- php抽象工厂模式