//大顶堆即是二叉数的节点越低他的值越大,假如节点的位置是i,他的左叶子节点是2*i+1,右叶子节点是2*i+2
static int[] arr=new int[]{3,5,2,5,67,7,3,8};
public static void frontShow(int index){
if(arr==null||arr.length==0){
return;
}
System.out.println(arr[index]);
//查询左节点2N+1
if(2*index+1<=arr.length-1){
frontShow(2*index+1);
}
//查询右节点
if(2*index+2<=arr.length-1){
frontShow(2*index+2);
}
}
public static void maxHeap(int[]arr, int size,int index){
int leftIndex=2*index+1;
int rightIndex=2*index+2;
int max=index;
if(leftIndex<size&&arr[max]<arr[leftIndex]){
max=leftIndex;
}
if(rightIndex<size&&arr[max]<arr[rightIndex]){
max=rightIndex;
}
if(max!=index){
arr[max]=arr[max]^arr[index];
arr[index]=arr[max]^arr[index];
arr[max]=arr[max]^arr[index];
//重新调整前面的节点为大顶堆
maxHeap(arr,size,max);
}
}
public static void heapSort(int ... arr){
//计算最后叶子节点的父节点位置
int index=(arr.length-1)/2;
//调整为大顶堆
for(int i=index;i>=0;i--){
maxHeap(arr,arr.length,i);
}
//将降序改为升序
/** for(int i=arr.length-1;i>=0;i--){
if(arr[0]>arr[i]){
arr[0]=arr[i]^arr[0];
arr[i]=arr[0]^arr[i];
arr[0]=arr[i]^arr[0];
}
maxHeap(arr,i,0);
}
**/
}
public static void main(String[] args) {
frontShow(0);
heapSort(arr);
System.out.println(Arrays.toString(arr));
}