java 堆排序 思想:将待排序的数组构造一个大顶堆,最大值为堆顶元素,然后跟数组最后一个元素交换,对除最后一个元素的数组进行重新构造一个大顶堆,以此类推,最后会生成一个升序的数组。
大顶堆:所有的父节点大于左右子节点的值
小顶堆:所有的父节点小于左右节点的值。
public static void main(String[] args){
int[] arr = {12,20,5,16,15,1,30,45,23,9};
heapSort(arr);
System.out.println(Arrays.toString(arr));
}
public static void heapSort(int[] arr){
//1.构建初始堆,arr[0]为最大元素
buildMaxHeap(arr);
// 注意这里是i>1 只有三个元素时----最后一次执行
for(int i=arr.length-1;i>1;i--){
swap(arr,0,i);
adjustHeap(arr,0,i);
}
}
/**
* 构建最大堆,arr[0] 是最大值
* @param arr
*/
public static void buildMaxHeap(int[] arr){
for(int i=(arr.length-1-1)/2;i>=0;i--){
adjustHeap(arr,i,arr.length);
}
}
/**
* 调整堆,k 父节点的编号 length: 需要调整的数组的范围的长度从1到length
* @param arr
* @param k
* @param length
*/
public static void adjustHeap(int[] arr,int k,int length){
int temp=arr[k];
for(int i=2*k+1;i<length-1;i=i*2+1){
if(arr[i]<arr[i+1]){
i++;
}
if(temp>arr[i]){
break;
}else{
arr[k]=arr[i];
k=i;
}
}
arr[k]=temp;
}
public static void swap(int[] arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}