堆排序的步骤:
第一步:构建堆
第二步:交换数组的第一个值(构建好大顶堆后,第一个值为数组的最大值)和最后一个值
这个时候数组的最后一个为最大值了,重复上述两个步骤,将数组长度length-1的排序 ,直到length-1 为1的时候停止
public class HeadSort {
public static void main(String[] args) {
int[] arr={3,1,2,4,4,9,8};
dosort(arr);
System.out.println(Arrays.toString(arr));
}
public static void dosort(int[] arr){
int length=arr.length;
while(length>1){
buildHead(arr,length);
swapMax(arr,length);
--length;
}
}
public static void buildHead(int[] arr,int length){
for(int i=(length-2)>>1;i>=0;i--){
casChild(arr,i,length);
}
}
/*
* 将父节点和子节点比较交换,把最大值放在父节点上
*/
public static void casChild(int[] arr,int parentindex,int length){
int rightindex=-1;
int leftindex=parentindex*2+1;
int maxchildindex=leftindex;
if(length-1>=parentindex*2+2){
rightindex=parentindex*2+2;
if(arr[rightindex]>arr[rightindex-1]){
maxchildindex=rightindex;
}
}
if(arr[parentindex]<arr[maxchildindex]){
int temp=arr[parentindex];
arr[parentindex]=arr[maxchildindex];
arr[maxchildindex]=temp;
}
}
//将最大值和在最后的值交换
public static void swapMax(int[] arr,int length){
int temp=arr[0];
arr[0]=arr[length-1];
arr[length-1]=temp;
}
}