首页 > 代码库 > 算法导论第六章__实现优先队列

算法导论第六章__实现优先队列

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  

算法导论第六章__实现优先队列