算法导论堆排序java实现

来源:互联网 发布:医院预约管理系统php 编辑:程序博客网 时间:2024/05/01 20:19

/**
 *
 * @author maobufan
 *  算法导论第六章堆排序 *
 */
public class Mergelist {
 
 private static int k,m;
 private int []A;

//heapsize<=A.length;代表堆的大小,建最大堆时,heapsize==A.length.,但是在最后一步heapsort排序中,由于“分离”出最大元素,堆中元素相应“减少”,此时heapsize是小于数组大小的

 private int heapSize;
 public Mergelist(int []A){
  this.A=A;
  this.heapSize=A.length;
 }
 
 public static  int[] initlist(int [][]temp,int []list){
  for(int j=0;j<temp.length;j++){
   list[j]=temp[j][0];
   }
  return list;
 }
 
 public static  void printlist(int []list){
  for(int i=0;i<list.length;i++){
   System.out.print("  "+list[i]);
  }
 }
 
 //保持堆的性质
 public  void maxHeap(int i){
  int l=2*i,r=2*i+1,largest;
  if(heapSize<0){
   return;
  }
  if(l<heapSize&&A[l]>A[i]){
   largest=l;
  }else {
   largest=i;
  }
  if(r<heapSize&&A[r]>A[largest]){
   largest=r;
  }
  //如果恰好largest就是i或者larget>heapsize,程序不往下进行
  if(largest==i||largest>heapSize){
   return;
  }
  int temp=A[i];
  A[i]=A[largest];
  A[largest]=temp;
  //递归调用
  maxHeap(largest);
  
  
 }
 //建堆
 public  void buildMaxHeap(){
  for(int i=A.length/2;i>=0;i--){
   maxHeap(i);
  }
  
 }
 //堆排序
 public  void heapSort(){


   for(int i=A.length-1;i>=1;i--)
      { 
//排好序的最大堆最大元素与第一个元素互换位置,再对剩下的元素建堆

     int tmp=A[i];
          A[i]=A[0];
          A[0]=tmp;

//关键,将堆中元素减小,然后只需对剩下的元素建成最大堆
          heapSize--;
          maxHeap(0);
      }

 }
 //返回A中最大元素
 public int maxNum(int []A){
  return A[0];
 }
 
 public static void main(String [] args){
  k=8;
  int [][]temp={{23,35,39,44},{55,66,77,88},{15,20,26,30},
    {19,20,16,20},{69,40,56,10},{39,30,66,0},{99,30,66,0},{3,30,66,0}};
  int []list=new int[k];
  list=initlist(temp,list);
  Mergelist m=new Mergelist(list);
  m.buildMaxHeap();
  m.heapSort();
  printlist(list);
 }
}
打印结果:

0 0
原创粉丝点击