首页 > 代码库 > 算法导论第六章__实现优先队列
算法导论第六章__实现优先队列
public class Priority_Queue { //储存的数组 private int A[]; //堆的大小 private int pile_Size=0; //如果找到指定值,返回 -1 private int NOT_FIND = -1; //堆容器的大小增量 private int INCREAT_CAPCITY=20; //堆容器大小 private static int INT_NUM=20; //构造函数1__不指定堆容器的大小,容器大小设置为默认大小,值:INT_NUM:20; public Priority_Queue(){ this(INT_NUM); } //构造函数2__指定堆容器的大小 public Priority_Queue(int capcity){ A=new int[capcity]; } //往容器里插入值,考虑到多线程,于是加入synchronized public synchronized void Insert(int value){ if(getHeap_size()==A.length){ increate_Capcity(); } A[pile_Size]=value; query_suitable_index(pile_Size++); } //修改堆容器里面的值 public synchronized boolean modify(int index,int value){ if(index<0||index>pile_Size){ return false; } if(value<A[index]){ return false; } A[index]=value; query_suitable_index(index); return true; } //修改或者增加元素,引起容器不满足堆的性质,所以需要进行“初始化”,使容器满足堆的性质 public void query_suitable_index(int index){ while(Parent(index)!=NOT_FIND && index>=1 && A[Parent(index)]<A[index]){ int exchange=A[index]; A[index]=A[Parent(index)]; A[Parent(index)]=exchange; index=Parent(index); } } //增加容器的大小 public void increate_Capcity(){ int []B=new int[A.length+INCREAT_CAPCITY]; for (int i = 0; i < A.length; i++) { B[i]=A[i]; } A=B; } //得到容器元素的个数 public int getHeap_size() { return pile_Size; } //得到左孩子 public int Left_Chiren(int i) { int left = i * 2 + 1; return (left < pile_Size) ? left : NOT_FIND; } //得到右孩子 public int Right_Chiren(int i) { int right = i * 2 + 2; return (right < pile_Size) ? right : NOT_FIND; } //得到父子节点 public int Parent(int i) { int parent = (i - 1) / 2; return (parent >= 0) ? parent : NOT_FIND; } //对堆容器从指定的节点往下"初始化"! public void Max_Pile(int i) { int left_Chiren = Left_Chiren(i); int right_Chiren = Right_Chiren(i); int largest; if (left_Chiren!=-1&&A[i] < A[left_Chiren]) { largest = left_Chiren; } else { largest = i; } if(right_Chiren!=-1&&A[largest]<A[right_Chiren]){ largest=right_Chiren; } if(largest!=i){ int largetValue=http://www.mamicode.com/A[largest];>
输出:
---------------测试insert()方法--------------------------
增加新元素:1
1
增加新元素:2
2 1
增加新元素:3
3 1 2
增加新元素:4
4 3 2 1
---------------测试extract_Max()方法---------------------
堆容器中最大的数:4
删除堆中最大的数,之后,容器变为:
3 0 2算法导论第六章__实现优先队列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。