package MySort;
public class HeapSort {
public static void main(String[] args){
HeapSort hs=new HeapSort();
int[] R={49,38,65,97,76,13,27,49};
hs.heapSort(R);
for(int i=0;i<R.length;i++){
System.out.println(R[i]);
}
}
public void heapSort(int[] R){
//该for循环用于创建一个堆,从n/2-1开始向前调整
for(int i = R.length/2-1;i>=0;i--){//r.length/2-1为最后一个非终端节点,向前调整
heapAdjust(R,i,R.length);
}
//该for循环用于把堆顶元素和无序区的最后一个元素交换,成为有序区的第一个元素,并进行堆调整
for(int j=R.length-1;j>0;j--){//每次调整出一个元素,则进行n-1趟排序
int temp=R[j];
R[j]=R[0];
R[0]=temp;
heapAdjust(R,0,j);
}
}
public void heapAdjust(int[] R,int s,int m){
int temp = R[s];//暂存
for(int j=2*s+1;j<m;j=j*2){
if(j<m-1&&R[j]<R[j+1]){//找出这个根节点的两个子节点中的最大的
j++; //j<m-1防止最后一个只有一个子节点,越界
}
if(temp>R[j]){//如果该元素已经是最大元素,则不用进行交换,直接跳出循环,自己与自己交换
break;
}else{//否则,需要进行交换
R[s]=R[j];
s=j;//s被赋予新值,接着从该节点向下遍历子节点
}
}
R[s]=temp;//一直找到大于或小于两个子节点的时候,把根节点放入该位置
}
}