您的位置:首页 > 编程语言 > Java开发

java基础之:堆排序

2014-06-17 17:09 85 查看
  最近做题目饱受打击,愈发觉得打好基础的重要性,于是乎,决心把基本的排序算法还有数组操作一一实现,目的在于
一方面能够得到对JAVA基础的巩固,另一面在实现的过程中发现不足。
  今天所实现的堆排序(最大堆)算法,最小堆大同小异。然后基于最大堆实现最大优先队列,最大优先队列可应用于作
业调度,比如可将作业长度作为关键字值,实现最长作业优先;或者将作业优先权值作为关键字值,实现高优先权作业优先
执行等等。
最大堆排序算法结构如下图:

  

//:ThinkingInJava/com.mindview.fundamental/MaxPriorityQueue.java
package com.mindview.fundamental;
/**
*
* @Time 2014-6-17
* @Descri MaxPriorityQueue.java
*            基于最大堆,实现最大优先队列,最大优先队列应用于作业调度
*           可将作业长度作为关键字,进行比较
* @author pattywgm
*
*/
public class MaxPriorityQueue {
int task[];
MaxHeap heap;
public MaxPriorityQueue(int[] task) {
this.task=task;
heap=new MaxHeap(task);
heap.buildMaxHeap();//创建最大堆
}
//获取最大关键字
public int heapMaxiMum(){
return task[0];
}
//去掉并返回最大关键字
public int heapExtractMax(){
if(heap.a_heapsize<1){
System.out.println("Error:heap underflow");
return -1;
}
else{
int max=task[0];
task[0]=task[heap.a_heapsize-1];
heap.a_heapsize=heap.a_heapsize-1;
heap.maxHeapIFY(0);
return max;
}
}
//在堆中插入元素x
public void heapInsert(int x){
task[heap.a_heapsize]=-1;
System.out.println("insert: "+heap.a_heapsize);
heap.a_heapsize=heap.a_heapsize+1;
if(heap.a_heapsize>task.length){
System.out.println("Error:array overflow");
return;
}
else{
heapIncreaseKey(heap.a_heapsize-1,x);
}
}
//将元素x值增加到key
public void heapIncreaseKey(int i,int key){
if(task[i]>=key){
System.out.println("new key is not bigger than current key");
return;
}
else{
task[i]=key;
//parent: (i-1)/2
while(i>0 && task[(i-1)/2]<task[i]){
heap.exchange(i, (i-1)/2);
i=(i-1)/2;
}
}
}

public void print(){
for(int i=0;i<heap.a_heapsize;i++){
System.out.print(task[i]+"  ");
}
}

}

///:~


View Code

  初始化调用MaxHeap类的buildMaxHeap()实现建立最大堆,即初始的最大优先队列。该最大优先队列支持以下操作:
    1)heapMaxiMum():获取最大关键字值(依据最大堆性质,实际上只是获取堆顶元素)
    2)heapExtractMax():去掉并返回最大关键字值,此时应注意重新调整堆(包括堆的大小和重新排列)
    3)heapInsert(key):在现有队列中插入元素key,该操作与4)结合实现
    4) heapIncreaseKey(i,key):将队列中指定位置处的值增加到key,注意值增加后堆性质的满足与否并做出相
    应调整
  映射到作业调度的问题,可将作业优先权值作为关键字值,1)或 2)操作获取当前作业队列中具有最高优先权的作业
进行调度, 2)操作更符合实际情况,在调度的同时更新队列;3)操作当有新的作业到来时将其插入优先权队列,并遵守
最大优先权最先执行的原则;4)操作在作业执行过程中,可能某个在优先权队列中的作业急需被调用,而其当前优先权却
不高,那么就需要提高其优先权,以使其能够被尽早调度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: