算法導論第六章__實現優先隊列

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  

發佈了66 篇原創文章 · 獲贊 7 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章