题目
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
思想
堆排序
代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
//利用堆排序
ArrayList<Integer> list = new ArrayList<Integer>();
if(input == null || k > input.length || k == 0)
return list;
heap_sort(input);
for(int i = 0;i < k;i++)
{
list.add(input[i]);
}
return list;
}
void heap_sort(int tree[])
{
bulid_heap(tree,tree.length);
for(int i = tree.length - 1;i >= 0;i--)
{
swap(tree,0,i);
heapify(tree,i,0);
}
}
void bulid_heap(int tree[],int n){
int last_node=n-1;
int parent=(last_node-1)/2;
for(int i=parent;i>=0;i--)
heapify(tree,n,i);
}
void heapify(int tree[],int n,int i){
if(i>=n)return;
int max=i;
int left_node=i*2+1;
int right_node=i*2+2;
if(left_node<n&&tree[max]<tree[left_node]){
max=left_node;
}
if(right_node<n&&tree[max]<tree[right_node]){
max=right_node;
}
if(max!=i){
swap(tree,i,max);
heapify(tree,n,max);
}
}
void swap(int tree[],int i,int j){
int t=tree[i];
tree[i]=tree[j];
tree[j]=t;
}
}