堆排序之java

import java.math.*;

import java.util.*;

public class Main {

public static void  MaxHeap(int[] tt,int pos,int len){

int temp=tt[pos];

/*System.out.println(“temp”+temp);*/

int child;

/**

* 下面的child=pos*2+1的意思为什么不是要求的左子树是pos*2,右子树是pos*2+1呢,这需要思考一下。

* 这里要判断pos*2+1<=len-1来确定pos的左子树是不是到达数组的末尾了,而为什么不是判断pos*2+2<=len-1,

* 这是因为如果判断pos*2+2<=len-1(判断右子树是否在数组范围以内了)的话,如果右子树如果没在数组范围以内,

* 那么他就把符合要求的左子树要刷掉,这是不公平的,所以只能先判断左子树,判断完之后再根据是否有右子树进行进一步

* 的判断。

*/

for(;pos*2+1<=len-1;pos=child){     

child=pos*2+1;

if(child<len-1&&tt[child]<tt[child+1]) child++;

if(temp<tt[child]) {

/*System.out.println(“temp=”+temp+”  change:”+tt[pos]+”,”+tt[child]);*/

tt[pos]=tt[child];

}

else break;

}

tt[pos]=temp;

}

public static void sortHeap(int[] tt,int len){

if(len<=1) return ;

/**

* 这里的i=len/2-1这个范围不是固定的,按照建堆的方法,从只要在整个数组一半后面就可以了,重建堆他

* 会自己去判断是否满足重建堆。

*/

for(int i=len/2-1;i>=0;i–){  

MaxHeap(tt,i,len);

}

System.out.println(“create done”);

/*for(int j=0;j<len;j++){

System.out.print(tt[j]+” “);

}

System.out.println();*/

System.out.println(“sort:”);

/**

* MaxHeap(tt,0,i)里的i一定要是i,不能是i-1,这是要按照重建堆的方法来的。i对应的是需要重建堆的数组的长度len定的。

*/

for(int i=len-1;i>=0;i–){

int temp=tt[i];

tt[i]=tt[0];

tt[0]=temp;

MaxHeap(tt,0,i);

/*for(int j=0;j<len;j++){

System.out.print(tt[j]+” “);

}

System.out.println();*/

}

}

public static void main(String[] args) {

int tt[]={2,3,1,6,9,10,11};

int len=tt.length;

sortHeap(tt,len);

Scanner s=new Scanner(System.in);

s.close();

for(int i=0;i<len;i++){

System.out.print(tt[i]+” “);

}

System.out.println();

}

}

点赞