/**
*
* @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);
}
}
打印结果: