public class TestHeapSort {
public static void main(String[] args){
int[] arr={3,1,2,4,7,6,5,9,8,10};
HSort(arr);
for(int a:arr)
System.out.print(a+" ");
}
// 堆排序
//进行堆排序方法
private static void HSort(int[] arr){
//1、构建大顶堆
for(int parent=(arr.length-1)/2;parent>=0;parent--){
MaxHeap(arr,parent,arr.length-1);
}
for(int t=arr.length-1;t>0;t--){
swap(arr,0,t); //交换数据
MaxHeap(arr, 0, t-1); //根节点从0开始,继续构建大顶堆。
}
}
//交换数据方法
private static void swap(int[] arr, int i, int t) {
int temp=arr[i];
arr[i]=arr[t];
arr[t]=temp;
}
/*
* 构建大顶堆的方法
* s 代表拥有左右孩子节点的节点,即本次要调整位置的节点
* m 代表当前堆的长度
*/
private static void MaxHeap(int[] arr, int s, int m) {
int temp,j;
temp=arr[s];
for(j=2*s+1;j<=m;j=2*j+1){ //j=2*s+1为s节点的左孩子,j+1为s节点的右孩子
//j=2*j+1是要找到j的孩子节点
if(j<m&&arr[j]<arr[j+1])
j++; //将j指向当前左右孩子节点中的较大值
if(temp>arr[j])
break; //如果s节点的值大于其最大的孩子节点值,则,循环结束,本次不做任何改变
arr[s]=arr[j]; //否则将较大的孩子节点的值赋值给父节点
s=j; //将j的值赋值给s,即j成为了下一波的父节点,继续比较
}
arr[s]=temp; //循环结束
}
}