大顶堆;降序
小顶堆;升序
排序思路;
1.先构建一颗顶堆树,从最后一个非叶子结点开始。(从左至右,从上至下)
2.使顶元素和最后一个元素进行交换,并再次替换形成新的顶堆。重复。
public static void heapSort(int []arr){
int temp=0;
System.out.println("堆排序:");
//1.将无序序列构建成一个堆
for(int i=arr.length/2-1;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
//2.将顶元素与末尾元素进行交换,再替换
for(int j=arr.length-1;j>0;j--){
//交换
temp=arr[j];
arr[j]=arr[0];
arr[0]=temp;
adjustHeap(arr,0,j);
}
System.out.println(Arrays.toString(arr));
}
//如何构建顶堆
//i:表示叶子结点在当前数组中的索引
//length:表示对多少个元素继续进行调整,length逐渐减少
public static void adjustHeap(int []arr,int i,int length){
int temp=arr[i];
//开始调整
//k是i结点的左子结点
for(int k=i*2+1;k<length;k=2*k+1){
if(k+1<length&&arr[k]<arr[k+1]){
k++; //k指向右子结点
}
if(arr[k]>temp){
arr[i]=arr[k];
i=k; //i指向k,继续循环比较
}else{
break;
}
}
arr[i]=temp; //将temp值放到调整后的位置
}