import com.sun.jmx.snmp.internal.SnmpIncomingRequest;
import java.util.Scanner;
/**
* 堆排序使用递归方法,通过模拟最大堆,来找出剩余数组中的最大值。
* 1、构建树:从最后非叶子结点出发构建
* 2.重构树:从根结点进行构建
* 3.构建函数为最大值元素下标赋值,左 右节点 还有让当前下标作为最大元素值的下标。
*/
public class HeapMaxSort {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
String[] strArr = line.split(" ");
int[] intArr = new int[strArr.length];
for(int i=0;i<intArr.length;i++){
intArr[i] = Integer.parseInt(strArr[i]);
}
//todo:排序
for (int num:intArr){
System.out.print(num+" ");
}
}
public static void headMaxSort(int[] array){
int n = array.length;
//公式:最后一个叶子结点下标公式为n/2-1
for(int i=n/2-1;i>=0;i--){
heapify(array, n,i);
}
for(int i=n-1;i>0;i--){
int temp=array[0];
array[0]=array[i];
array[i]=temp;
heapify(array,i,0);
}
}
private static void heapify(int[] array, int n, int i) {
int largest=i;
//公式:左叶子:2*i+1
int left=2*i+1;
//公式:右叶子:2*i+2
int right=2*i+2;
if(left<n && array[left]>array[largest]){
largest=left;
}
if (right<n && array[right]>array[largest]){
largest=right;
}
if(largest !=i){
int temp=array[i];
array[i]=array[largest];
array[largest]=temp;
heapify(array,n,largest);
}
}
}
Leetcode刷题:堆排序
最新推荐文章于 2024-09-16 06:54:08 发布