import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution{
public static void main(String[] args) {
int arr[]=new int[]{-5,80,33,-9,107,9,65,60,77,90,220,55,190,60};
heapSort(arr);
System.out.printf(Arrays.toString(arr));
}
//堆排序
public static void heapSort(int arr[]){
//1.初始化大顶堆
//从下往上,右往左调整
for (int i = arr.length/2-1; i >=0 ; i--) {
adjustheap(arr,i,arr.length);
}
//2.排序,调整把最大的元素放到数组末尾
for (int i = arr.length-1; i >=0 ; i--) {
//交换首尾
int t=arr[0];
arr[0]=arr[i];
arr[i]=t;
//从新调整大顶堆
adjustheap(arr,0,i);
}
}
//调整大顶堆
private static void adjustheap(int[] arr, int i, int length) {
int temp=arr[i];//先取出当前元素
for (int k = i*2+1; k < length; k=k*2+1) { //得到i的左右节点
if(k+1<length && arr[k]<arr[k+1]){//有右节点,并且右节点大
k++;//k指向最大的节点
}
if (arr[k]>temp){//孩子节点比根节点大
arr[i]=arr[k];//把最大的节点放到i,即放到当前的根节点上
i=k;//i发生变化,即调整后面的子孙节点
}else{
break;//因为是从下往上,右往左,所以当前根节点已经大于所以子孙节点了
}
}
//最后还原根节点
arr[i]=temp;
}
}
排序~堆排序
最新推荐文章于 2024-10-31 22:20:13 发布