AcWing 838. 堆排序-java
原题链接
简单
作者:
单箭头
,
2019-06-10 13:45:59
,
所有人可见
,
阅读 1065
java 代码
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++)
arr[i]=sc.nextInt();
arr=buildMaxHeap(arr,n);//构建大根堆
for(int i=n-1;i>0;i--){
int tmp=arr[i];
arr[i]=arr[0];
arr[0]=tmp;
adjustDownToUp(arr,0,i);//自底向上,将最大元素调整位置
}
for(int i=0;i<m;i++)
System.out.print(arr[i]+" ");
}
private static int[] buildMaxHeap(int[] arr,int n){
for(int i=(n-1-1)/2;i>=0;i--)
adjustDownToUp(arr,i,n);
return arr;
}
private static void adjustDownToUp(int[] arr,int k,int length){
int tmp=arr[k];
for(int i=2*k+1;i<length;i=2*i+1){
if(i+1<length && arr[i+1]>arr[i]) i++;//取两个子节点的较大值
if(tmp>arr[i]) break;
else{
arr[k]=arr[i];//交换结点
k=i;
}
}
arr[k]=tmp;
}
}