大顶堆:将元素较大的数往上浮,从数组的最后一个根节点往上逐渐堆化,堆化完成后进行第一个元素与最后一个元素值对调这样最大的元素就在数组末尾,缩短末尾,再次调整大顶堆。
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
sort(arr,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr,int i){
maxHeap(arr);
while(i>=0){
swap(arr,0,i);
pile(arr,0,i);
i--;
}
}
public static void maxHeap(int[] arr){
int n = arr.length;
for(int i = n/2-1;i>=0;i--){
pile(arr,i,n);
}
}
public static void pile(int[] arr,int root,int n){
int left = 2*root+1;
int right = 2*root+2;
if(left>=n){
return;
}
int max = left;
if(right<n && arr[right]>arr[left]){
max = right;
}
if(arr[max]<=arr[root]){
return;
}
swap(arr, max,root);
pile(arr, max,n);
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp;
}
}
小顶堆:与大顶堆思路相同,将最小值往上浮。
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = input.nextInt();
}
sort(arr,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr,int i){
maxHeap(arr);
while(i>=0){
swap(arr,0,i);
pile(arr,0,i);
i--;
}
}
public static void maxHeap(int[] arr){
int n = arr.length;
for(int i = n/2-1;i>=0;i--){
pile(arr,i,n);
}
}
public static void pile(int[] arr,int root,int n){
int left = 2*root+1;
int right = 2*root+2;
if(left>=n){
return;
}
int min = left;
if(right<n && arr[right]<arr[left]){
min = right;
}
if(arr[min]>=arr[root]){
return;
}
swap(arr, min,root);
pile(arr, min,n);
}
public static void swap(int[] arr,int a,int b){
int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp;
}
}