堆排序(最小的K个数)
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
return MinHeapSort(input, k, input.length);
}
//向下调整
public void MinHeapFixdown(int[] a,int i,int n){
int temp=a[i];
int j=2*i+1;
while(j<n){
if(j+1<n&&a[j]>a[j+1]) j++;
if(a[j]>=temp) break;
a[i]=a[j];
i=j;
j=2*i+1;
}
a[i]=temp;
}
//建立最小堆
public void createMinHeap(int[] a,int n){
for(int i=n/2-1;i>=0;i--){
MinHeapFixdown(a,i,n);
}
}
//返回前k个最小数
public ArrayList<Integer> MinHeapSort(int[] a,int k,int n){
ArrayList<Integer> list= new ArrayList<Integer> ();
if(k>n) return list;
createMinHeap(a, n);
for(int i=0;i<k;i++ ){
int temp=a[0];
list.add(temp);
a[0]=a[n-i-1];
a[n-i-1]=temp;
MinHeapFixdown( a, 0, n-i-1);
}
return list;
}
}