- package com.priorityquence;
- /**
- *
- * @author kinglong1203 2011.2.20
- *
- */
- public class MaxPriorityQuence {
- private int size ;
- private int quenceSize;
- private int[] array;
- public MaxPriorityQuence(){
- size = 50;
- quenceSize = 0;
- array = new int[size];
- }
- public MaxPriorityQuence(int size) {
- super();
- this.size = size;
- this.quenceSize = 0;
- array = new int[size];
- }
- public int getSize() {
- return size;
- }
- public void setSize(int size) {
- this.size = size;
- }
- public int getQuenceSize() {
- return quenceSize;
- }
- public void setQuenceSize(int quenceSize) {
- this.quenceSize = quenceSize;
- }
- public boolean isFull(){
- if(quenceSize == size){
- return true;
- }
- return false;
- }
- public boolean isEmpty(){
- if(quenceSize < 1){
- return true;
- }
- return false;
- }
- public void maxPriorityIncrease(int i,int x){
- if(x < array[i-1]){
- System.out.println("该值比现有值小,不能增加!");
- }
- i = i -1;
- array[i] = x;
- while(i>0 && array[(i-1)/2] < array[i]){
- int temp = array[i];
- array[i] = array[(i-1)/2];
- array[(i-1)/2] = temp;
- i = (i-1)/2;
- }
- }
- public void maxPriorityInsert(int x){
- if(!isFull()){
- array[quenceSize] = Integer.MIN_VALUE;
- quenceSize++;
- maxPriorityIncrease(quenceSize,x);
- } else {
- System.out.println("队列已满!");
- }
- }
- //获得优先级最大的元素,
- public int maximum(){
- buildMaxHeap();
- return array[0];
- }
- //提取优先级最大的元素,队列中删除该元素
- public int extractMax(){
- if(quenceSize < 1){
- System.err.println("队列为空!");
- return -1;
- }
- quenceSize--;
- int max = array[0];
- array[0] = array[quenceSize];
- maxPriority(1);
- return max;
- }
- //创建最大堆
- private void buildMaxHeap(){
- for(int i = quenceSize/2; i >= 2;i--){
- maxPriority(i);
- }
- }
- //从i开始调整成最大堆
- private void maxPriority(int i){
- int s = i - 1;
- for(int j = 2*s+1;j<quenceSize;j = j*2+1){
- if(j < quenceSize-1 && array[j] < array[j+1])
- j++;
- if(array[s] >= array[j])
- break;
- int temp = array[s];
- array[s] = array[j];
- array[j] = temp;
- s = j;
- }
- }
- //打印队列
- public void printQuence(){
- for(int i = 0; i < quenceSize; i++){
- System.out.print(" " + array[i]);
- }
- System.out.println(" ");
- }
- }
测试代码:
- package com.priorityquence;
- /**
- *
- * @author kinglong1203 2011.2.20
- *
- */
- public class MaxPriorityQuenceTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- MaxPriorityQuence maxPriority = new MaxPriorityQuence();
- maxPriority.maxPriorityInsert(15);
- maxPriority.maxPriorityInsert(13);
- maxPriority.maxPriorityInsert(9);
- maxPriority.maxPriorityInsert(5);
- maxPriority.maxPriorityInsert(12);
- maxPriority.maxPriorityInsert(8);
- maxPriority.maxPriorityInsert(7);
- maxPriority.maxPriorityInsert(4);
- maxPriority.maxPriorityInsert(0);
- maxPriority.maxPriorityInsert(6);
- maxPriority.maxPriorityInsert(2);
- maxPriority.maxPriorityInsert(1);
- System.out.println("优先级最高的是: "+maxPriority.maximum());
- maxPriority.printQuence();
- maxPriority.maxPriorityInsert(10);
- System.out.println("优先级最高的是: "+maxPriority.maximum());
- maxPriority.extractMax();
- maxPriority.printQuence();
- }
- }