AcWing 838. 堆排序 Java版 最易读懂的版本
原题链接
简单
作者:
lkm
,
2020-08-19 21:37:32
,
所有人可见
,
阅读 952
import java.util.Scanner;
/*
输入一个长度为n的整数数列,从小到大输出前m小的数。
输入格式
第一行包含整数n和m。
第二行包含n个整数,表示整数数列。
输出格式
共一行,包含m个整数,表示整数数列中前m小的数。
数据范围
1≤m≤n≤10^5,
1≤数列中元素≤10^9
输入样例:
5 3
4 5 1 3 2
输出样例:
1 2 3
*/
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();
int size = n;
for (int i = (size - 1) / 2; i >= 0; i--) down(arr, i, size);
while (m-- > 0) {
System.out.print(arr[0] + " ");
arr[0] = arr[size - 1];
size--;
down(arr, 0, size);
}
}
private static void down(int[] arr, int i, int n) {
int c1 = 2 * i + 1, c2 = 2 * i + 2;
int min = i;
if (c1 < n && arr[c1] < arr[min]) min = c1;
if (c2 < n && arr[c2] < arr[min]) min = c2;
if (i != min) {
swap(arr, i, min);
down(arr, min, n);
}
}
public static void swap(int[]arr, int i, int j) {
int t = arr[i]; arr[i] = arr[j]; arr[j] = t;
}
}
大哥,这样写直接TLE了,Java好难搞!
创建的时候,(size-1)/2跟1-index情况下的size/2并不等价。奇数个的时候会多down一次
写错了兄弟,左孩子是2n右孩子是2n+1
老哥,这个是从0开始,y总是从1开始。不过问题不大