找出无序数组中的最小的k个数(利用大根堆)

时间:2022-12-30 15:17:50
package com.itheima.paixu;

import java.util.Scanner;

/**
* 找到无序数组中最小的k个数
* @author Dell
*
*/
public class Test3 {

public static int[] getMinKNumsByHeap(int[]a ,int k)
{
if(a.length==0||k<=0||k>a.length)
return null;
//初始大根堆的建立
int[] result=new int[k];
for(int i=0;i<k;i++)
{
heapInsert(result, a[i],i);
}

//如果当前元素小于大根堆堆顶元素,则交换后,调整整个堆。
for(int i=k;i<a.length;i++)
{
if(a[i]<result[0])
{
int temp=a[i];
a[i]=result[0];
result[0]=temp;
heapify(result,0,k-1);
}

}

return result;
}

public static void heapInsert(int[]a ,int value, int index)
{
a[index]=value;
while(index!=0)
{

int parent=(index-1)/2;
if(a[parent]<a[index])
{
int temp=a[parent];
a[parent]=a[index];
a[index]=temp;
index=parent;
}
else
break;
}

}
public static void heapify(int[] a, int start ,int end)
{
int i=start;
int j=2*i+1;
int temp=a[start];
while(j<=end)
{
if(j<end&&a[j]<a[j+1])
j++;
if(temp<a[j])
{
a[i]=a[j];
i=j;
j=2*i+1;
}
else
break;

}
a[i]=temp;

}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++)
{
a[i]=sc.nextInt();
}
int k=sc.nextInt();
int[] result=getMinKNumsByHeap(a,k);
for(int i=0;i<result.length;i++)
{
System.out.print(result[i]+" ");
}
}

}