package org.example.test;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
/**
* 首先使用大小为K的数组,读入钱K个数,建立大顶堆。
* 然后一次读入余下的数,若大于大顶堆,则舍弃,否则用改数取代堆顶并重新调整堆,待数据读取完毕,
* 堆中K个数即为所求
*/
public class HeapTest {
public static void main(String[] args) {
int[] input = {4,5,1,6,2,7,3,8};
System.out.println(JSONObject.toJSONString(GetLeastNumbers_Solution(input, 4)));
}
public static ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
ArrayList<Integer> ret = new ArrayList<>();
if (k==0){
return ret;
}
ret.add(0);
for (int i = 0; i < k; i++) {
ret.add(input[i]);
}
for (int i = k / 2; i > 0; i--) {
headAdjust(ret, i, k);
}
for (int i = k ; i < input.length; i++) {
if (ret.get(1) > input[i]) {
ret.set(1, input[i]);
headAdjust(ret, 1, k);
}
}
ret.remove(0);
return ret;
}
private static void headAdjust(ArrayList<Integer> heap, int i, int len) {
heap.set(0, heap.get(i));
for (int j = 2 * i; j <= len; j *= 2) {
if (j < len && heap.get(j) < heap.get(j + 1)) {
j++;
}
if (heap.get(0) >= heap.get(j)) {
break;
} else {
heap.set(i, heap.get(j));
i = j;
}
}
heap.set(i, heap.get(0));
}
}