Java实现堆,最大堆,最小堆,左高树,左低树
2018-03-21 09:47
471 查看
MyList.LinearList参见链接
MyTree.TreeNode参见链接
MyTree.TreeNode参见链接
Heap
package MyHeap; public interface Heap { abstract public int size(); abstract public int maxSize(); abstract public boolean empty(); abstract public boolean full(); abstract public Comparable top(); abstract public Comparable pop(); abstract public Heap push(Comparable object); abstract public void initialize(Comparable[] object); abstract public void output(); }
MaxHeap
package MyHeap; import java.util.Random; import MyList.LinearList; public class MaxHeap implements Heap { public static void main(String[] args){ MaxHeap heap=new MaxHeap(); Random random=new Random(); for(int i=0;i<100;i++){ heap.push(random.nextInt(1000)); } heap.output(); System.out.println("Size:"+heap.size()); for(int i=0;i<100;i++){ System.out.print(heap.pop()+" "); System.out.print("\r\n"); } System.out.print("\r\n"); } private int MaxSize; private MyList.LinearList List; public MaxHeap(){ MaxSize=-1; List=new LinearList(); } public MaxHeap(int maxsize){ MaxSize=maxsize; List=new LinearList(); } @Override public int size() { // TODO Auto-generated method stub return List.size(); } @Override public int maxSize() { // TODO Auto-generated method stub return MaxSize; } @Override public boolean empty() { // TODO Auto-generated method stub return size()==0; } @Override public boolean full() { // TODO Auto-generated method stub return size()==maxSize(); } private int parent(int index){ if(index>=size()||index<=0){ return -1; } else{ return (index-1)/2; } } private int leftChild(int index){ int output=index*2+1; if(output>=size()||index<0){ return -1; } else{ return output; } } private int rightChild(int index){ int output=index*2+2; if(output>=size()||index<0){ return -1; } else{ return output; } } @Override public Comparable top() { // TODO Auto-generated method stub return (Comparable) List.at(0); } private void reformDown(int index){ int leftchild=leftChild(index); int rightchild=rightChild(index); if(leftchild==-1&&rightchild==-1){ return; } else if(leftchild==-1){ if(((Comparable) List.at(rightchild)) .compareTo((Comparable) List.at(index))==1) { List.swap(index,rightchild); reformDown(rightchild); } else{ return; } } else if(rightchild==-1){ if(((Comparable) List.at(leftchild)) .compareTo((Comparable) List.at(index))==1) { List.swap(index,leftchild); reformDown(leftchild); } else{ return; } } else if(((Comparable) List.at(leftchild)) .compareTo((Comparable) List.at(rightchild))==1) { List.swap(index, leftchild); reformDown(leftchild); } else{ List.swap(index,rightchild); reformDown(rightchild); } } @Override public Comparable pop() { // TODO Auto-generated method stub if(empty()){ System.out.println("heap is empty"); return null; } else{ Comparable object=top(); List.swap(0, size()-1); List.deleteByIndex(size()-1); reformDown(0); return object; } } private void reformUp(int index){ int parent=parent(index); while(parent!=-1&& ((Comparable) List.at(parent)) .compareTo((Comparable) List.at(index))==-1) { List.swap(parent, index); reformUp(parent); } } @Override public Heap push(Comparable object) { // TODO Auto-generated method stub if(full()){ System.out.println("heap is full"); } else{ List.insert(object); reformUp(size()-1); } return this; } @Override public void initialize(Comparable[] object) { // TODO Auto-generated method stub List.setMaxLength(object.length); for(int i=0;i<object.length;i++){ push(object[i]); } } @Override public void output() { // TODO Auto-generated method stub List.output(); } }
MaxHblt
package MyHeap; import java.util.Random; import MyTree.TreeNode; public class MaxHblt implements Heap { public static void main(String[] args){ MaxHblt hblt=new MaxHblt(); Random random=new Random(); for(int i=0;i<100;i++){ hblt.push(random.nextInt(1000)); } hblt.output(); System.out.println("Size:"+hblt.size()); System.out.println("Height:"+hblt.height()); for(int i=0;i<100;i++){ System.out.print(hblt.pop()+" "); System.out.print("\r\n"); } System.out.print("\r\n"); } private int MaxSize; private TreeNode Root; public MaxHblt(){ MaxSize=-1; Root=new TreeNode(); } public MaxHblt(int maxsize){ MaxSize=maxsize; Root=new TreeNode(); } @Override public int size() { // TODO Auto-generated method stub return Root.size(); } @Override public int maxSize() { // TODO Auto-generated method stub return MaxSize; } @Override public boolean empty() { // TODO Auto-generated method stub return size()==0; } @Override public boolean full() { // TODO Auto-generated method stub return size()==maxSize(); } public int height(){ return Root.height(); } @Override public Comparable top() { // TODO Auto-generated method stub return Root.root(); } private TreeNode combine(TreeNode hblt1,TreeNode hblt2){ if(hblt1==null||hblt1.size()==0){ return hblt2; } else if(hblt2==null||hblt2.size()==0){ return hblt1; } else{ TreeNode node; if((hblt1.root()).compareTo(hblt2.root())==1){ node=new TreeNode( hblt1.root(), hblt1.leftChild(), combine( hblt1.rightChild(), hblt2 ) ); } else{ node=new TreeNode( hblt2.root(), hblt2.leftChild(), combine( hblt2.rightChild(), hblt1 ) ); } if(node.leftChild()==null||node.leftChild().height()<node.rightChild().height()){ node=new TreeNode( node.root(), node.rightChild(), node.leftChild() ); } return node; } } @Override public Comparable pop() { // TODO Auto-generated method stub if(empty()){ System.out.println("heap is empty"); return null; } else{ Comparable object=top(); Root=combine(Root.leftChild(),Root.rightChild()); return object; } } @Override public Heap push(Comparable object) { // TODO Auto-generated method stub if(full()){ System.out.println("heap is full"); } else{ TreeNode node=new TreeNode(object); Root=combine(Root,node); } return this; } @Override public void initialize(Comparable[] object) { // TODO Auto-generated method stub for(int i=0;i<object.length;i++){ push(object[i]); } } @Override public void output() { // TODO Auto-generated method stub Root.preOrder(); System.out.print("\r\n"); } }
MinHeap
package MyHeap; import java.util.Random; import MyList.LinearList; public class MinHeap implements Heap { public static void main(String[] args){ MinHeap heap=new MinHeap(); Random random=new Random(); for(int i=0;i<100;i++){ heap.push(random.nextInt(1000)); } heap.output(); System.out.println("Size:"+heap.size()); for(int i=0;i<100;i++){ System.out.print(heap.pop()+" "); System.out.print("\r\n"); } System.out.print("\r\n"); } private int MaxSize; private MyList.LinearList List; public MinHeap(){ MaxSize=-1; List=new LinearList(); } public MinHeap(int maxsize){ MaxSize=maxsize; List=new LinearList(); } @Override public int size() { // TODO Auto-generated method stub return List.size(); } @Override public int maxSize() { // TODO Auto-generated method stub return MaxSize; } @Override public boolean empty() { // TODO Auto-generated method stub return size()==0; } @Override public boolean full() { // TODO Auto-generated method stub return size()==maxSize(); } private int parent(int index){ if(index>=size()||index<=0){ return -1; } else{ return (index-1)/2; } } private int leftChild(int index){ int output=index*2+1; if(output>=size()||index<0){ return -1; } else{ return output; } } private int rightChild(int index){ int output=index*2+2; if(output>=size()||index<0){ return -1; } else{ return output; } } @Override public Comparable top() { // TODO Auto-generated method stub return (Comparable) List.at(0); } private void reformDown(int index){ int leftchild=leftChild(index); int rightchild=rightChild(index); if(leftchild==-1&&rightchild==-1){ return; } else if(leftchild==-1){ if(((Comparable) List.at(rightchild)) .compareTo((Comparable) List.at(index))==-1) { List.swap(index,rightchild); reformDown(rightchild); } else{ return; } } else if(rightchild==-1){ if(((Comparable) List.at(leftchild)) .compareTo((Comparable) List.at(index))==-1) { List.swap(index,leftchild); reformDown(leftchild); } else{ return; } } else if(((Comparable) List.at(leftchild)) .compareTo((Comparable) List.at(rightchild))==-1) { List.swap(index, leftchild); reformDown(leftchild); } else{ List.swap(index,rightchild); reformDown(rightchild); } } @Override public Comparable pop() { // TODO Auto-generated method stub if(empty()){ System.out.println("heap is empty"); return null; } else{ Comparable object=top(); List.swap(0, size()-1); List.deleteByIndex(size()-1); reformDown(0); return object; } } private void reformUp(int index){ int parent=parent(index); while(parent!=-1&& ((Comparable) List.at(parent)) .compareTo((Comparable) List.at(index))==1) { List.swap(parent, index); reformUp(parent); } } @Override public Heap push(Comparable object) { // TODO Auto-generated method stub if(full()){ System.out.println("heap is full"); } else{ List.insert(object); reformUp(size()-1); } return this; } @Override public void initialize(Comparable[] object) { // TODO Auto-generated method stub List.setMaxLength(object.length); for(int i=0;i<object.length;i++){ push(object[i]); } } @Override public void output() { // TODO Auto-generated method stub List.output(); } }
MinHblt
package MyHeap; import java.util.Random; import MyTree.TreeNode; public class MinHblt implements Heap { public static void main(String[] args){ MinHblt hblt=new MinHblt(); Random random=new Random(); for(int i=0;i<100;i++){ hblt.push(random.nextInt(1000)); } hblt.output(); System.out.println("Size:"+hblt.size()); System.out.println("Height:"+hblt.height()); for(int i=0;i<100;i++){ System.out.print(hblt.pop()+" "); System.out.print("\r\n"); } System.out.print("\r\n"); } private int MaxSize; private TreeNode Root; public MinHblt(){ MaxSize=-1; Root=new TreeNode(); } public MinHblt(int maxsize){ MaxSize=maxsize; Root=new TreeNode(); } @Override public int size() { // TODO Auto-generated method stub return Root.size(); } @Override public int maxSize() { // TODO Auto-generated method stub return MaxSize; } @Override public boolean empty() { // TODO Auto-generated method stub return size()==0; } @Override public boolean full() { // TODO Auto-generated method stub return size()==maxSize(); } public int height(){ return Root.height(); } @Override public Comparable top() { // TODO Auto-generated method stub return Root.root(); } private TreeNode combine(TreeNode hblt1,TreeNode hblt2){ if(hblt1==null||hblt1.size()==0){ return hblt2; } else if(hblt2==null||hblt2.size()==0){ return hblt1; } else{ TreeNode node; if((hblt1.root()).compareTo(hblt2.root())==-1){ node=new TreeNode( hblt1.root(), hblt1.leftChild(), combine( hblt1.rightChild(), hblt2 ) ); } else{ node=new TreeNode( hblt2.root(), hblt2.leftChild(), combine( hblt2.rightChild(), hblt1 ) ); } if(node.leftChild()==null||node.leftChild().height()<node.rightChild().height()){ node=new TreeNode( node.root(), node.rightChild(), node.leftChild() ); } return node; } } @Override public Comparable pop() { // TODO Auto-generated method stub if(empty()){ System.out.println("heap is empty"); return null; } else{ Comparable object=top(); Root=combine(Root.leftChild(),Root.rightChild()); return object; } } @Override public Heap push(Comparable object) { // TODO Auto-generated method stub if(full()){ System.out.println("heap is full"); } else{ TreeNode node=new TreeNode(object); Root=combine(Root,node); } return this; } @Override public void initialize(Comparable[] object) { // TODO Auto-generated method stub for(int i=0;i<object.length;i++){ push(object[i]); } } @Override public void output() { // TODO Auto-generated method stub Root.preOrder(); System.out.print("\r\n"); } }
相关文章推荐
- 最大堆和最小堆求数据流中的中位数【java实现】
- 堆排序 最大堆 最小堆 Java实现
- java最小堆实现优先权队列和求最大的n个数问题
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
- 最小堆和最大堆的JAVA实现
- Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
- java 最大公约数 最小公倍数 用函数实现
- 求连续子数组的最大和O(n)解法之思路与Java实现
- 求最大子序列和(Java实现)
- 用最大堆和最小堆实现中位数查找
- 在柱状图中找最大矩形——O(n)时间复杂度java实现
- 数组问题之一维最大字段和问题<Java实现>
- [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
- 算法学习之最大子序列算法(java实现)
- 使用最大堆和最小堆实现中位数的查找
- 基于Tire树和最大概率法的中文分词功能的Java实现
- 基于Tire树和最大概率法的中文分词功能的Java实现
- 三种算法求最大子段和问题——Java实现
- Java实现最大二叉堆中找min<=x<max的x们
- 一个用Java实现的简单的最大堆