假如你有一组数据,现在让你求出前K大的数字。有的人说,直接排序不就Ok了。那么我的问题来了。
如果这个数据很多呢,并且现在给你分配的内存很小,不足以让你开辟足够大的空间去存储数组。我们该怎么办。
这个时候我们就可以用堆来实现。
比如我们现在有300000个随机数字,现在让你找出来前100大的数字。
思路:我们可以建立一个容量为100堆,先将前100个数据存入。将堆变成小根堆,接下来每次从随机数字中取出一个数字,和堆顶的元素比较大小,如果大于堆顶的元素,将堆顶元素替换,在将堆变成小根堆。以此类推,直到所有元素遍历完。
堆实现模块
public class TestHeap {
private final int DEFALUT_SIZE = 10;
private int[] elem ;
public TestHeap() {
this.elem = new int[DEFALUT_SIZE];
}
public void heapSort(int[] arr){
int i;
//先将前k个元素存入堆中
for(i = 0;i<DEFALUT_SIZE;i++){
elem[i] = arr[i];
}
while(i<arr.length){
smallHeapSort(arr[i]);
i++;
}
this.show();
}
//小根堆实现
public void smallHeapSort(int a