码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-22 18:06:02      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:算法导论

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=A[largest];
		    A[largest]=A[i];
		    A[i]=largetValue;
		    Max_Pile(largest);
		}
	}
	//将这个堆进行排序
	public void Heap_Sort(){
	     //从小到大的排序
		for (int i = pile_Size-1; i >=1; i--) {
		    int exchange=A[i];
		    A[i]=A[0];
		    A[0]=exchange;
		    
		    pile_Size--;
		    
		    Max_Pile(0);
		}
	}
	//得到堆中最大的元素
	public int getMax(){
		return A[0];
	}
	//得到堆中最大的元素,并删除最大的元素
	public int extract_Max(){
		if(pile_Size<1){
		   return NOT_FIND;
		}
		int Max=A[0];
		A[0]=A[pile_Size--];
		Max_Pile(0);
		return Max;
	}
	//打印
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<pile_Size;i++)
			sb.append(A[i]+"  ");
		return sb.toString();
	}
	//测试
	public static void main(String[] args) {
		Priority_Queue pile=new Priority_Queue();
		
		System.out.println("---------------测试insert()方法--------------------------");
		for (int i = 1; i < 5; i++) {
			pile.Insert(i);
			System.out.println("增加新元素:"+i);
			System.out.println(pile);
		}

		System.out.println("---------------测试extract_Max()方法---------------------");
		System.out.println("堆容器中最大的数:"+pile.extract_Max());
		System.out.println("删除堆中最大的数,之后,容器变为:");
		System.out.println(pile);
	}
}


输出:

---------------测试insert()方法--------------------------
增加新元素:1
1  
增加新元素:2
2  1  
增加新元素:3
3  1  2  
增加新元素:4
4  3  2  1  
---------------测试extract_Max()方法---------------------
堆容器中最大的数:4
删除堆中最大的数,之后,容器变为:
3  0  2  

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

标签:算法导论

原文地址:http://blog.csdn.net/u012427937/article/details/38039747

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!