import java.util.Scanner;
import java.util.Arrays;
class Main{
static int heap[] ;
static int heapSize ; //堆元素个数
public static void buildMaxHeap(){ //建造最大堆
int len = (heap.length-2)/2;
for(int i=len;i>=0;i--)
maxify(i);
}
public static void maxify(int start){ //最大化以start为顶点的堆
int i = start,j = 2*i+1;
int temp = heap[i];
while(j<heapSize){
if(j+1<heapSize&&heap[j]<heap[j+1]) //找左右孩子中最大的一个
j++;
if(temp>=heap[j])
break;
else{
heap[i] = heap[j];
i = j;
j = j*2+1;
}
}
heap[i] = temp; //找到合适位置将heap[start]插入
}
public static void swap(int i,int j){
int temp = heap[i];
heap[i] = heap[j];
heap[j] = temp;
}
public static void heapSort(){ //堆排序
buildMaxHeap();
for(int i=heap.length-1;i>=1;i--){
swap(0,i); //将堆顶元素与最后一个值交换
heapSize--; //堆大小减1
maxify(0); //最大化堆顶元素
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
heapSize = in.nextInt(); //输入数据量
heap = new int[heapSize];
for(int i=0;i<heapSize;i++){
heap[i] = (int)(Math.random()*100); //生成随机值
}
System.out.println("未排序时:");
System.out.println(Arrays.toString(heap));
heapSort();
System.out.println("排序后:");
System.out.println(Arrays.toString(heap));
}
}