算法思想:维护一个由K个元素组成的大顶堆,依次将数组中的元素与堆顶元素比较,
如果大于堆顶元素则舍弃,否则将元素放入堆顶并重新建堆。
如果对堆的相关知识不清楚可参考:排序算法之堆排序
java实现:
public static int[] getMinElements(int[] a,int k){
int[] heap=new int[k];
//取数组的前k个元素
for(int i=0;i<k;i++){
heap[i]=a[i];
}
for(int i=k/2;i>=0;i--){
heapAjust(heap,i);
}
//从数组的第k+1个元素开始遍历
for(int i=k;i<a.length;i++){
if(a[i]<heap[0]){
heap[0]=a[i];
heapAjust(heap, 0);
}
}
return heap;
}
//重新将数组的第i+1个元素调整为堆
private static void heapAjust(int[] a,int i){
int index=0;
for(int j=i;2*j+1<a.length-1;j=index)
{
index=2*j+1;
if(index<a.length-1 && a[index+1]>a[index]){
index++;
}
if(a[index]>a[j]){
int temp=a[index];
a[index]=a[j];
a[j]=temp;
}
}
}