堆排序实现: 容量不足:在最后插入元素+ 自下而上 容量满:对比是否小于堆顶元素:小于->替换堆顶元素+自上而下堆化
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
ArrayList<Integer> list = new ArrayList();
if(k<=0){
return list;
}
if(input==null || input.length<=0){
return list;
}
if(input.length<k){
for(int i=0;i<input.length;++i){
list.add(input[i]);
}
return list;
}
HeapMaxTop heapM = new HeapMaxTop(k);
for(int i=0;i<input.length;++i){
heapM.insert(input[i]);
}
return heapM.toList();
}
public class HeapMaxTop {
//first pass
private final int[] data;
private final int capacity;
private int count;
public HeapMaxTop(int capacity){
this.capacity = capacity>0?capacity:1;
this.data = new int[this.capacity+1];
}
public ArrayList<Integer> toList(){
ArrayList<Integer> list = new ArrayList();
for(int i=1;i<=count;i++){
list.add(data[i]);
}
return list;
}
public boolean isFull(){
return count >= capacity;
}
/**
*插入 或 替换
*/
public void insert(int val){
if(isFull()){
if(val < data[1]){
data[1]=val;
heapify(1);
}
return;
}
count++;
data[count]=val;
//自下而上
int i = count;
while(i/2 >0 && data[i]>data[i/2]){
swap(i,i/2);
i=i/2;
}
}
/**
* 自上而下
*/
private void heapify(int i){
while(i<=count){
int maxPos = i;
int left = i*2;
if(left<=count && data[left]>data[maxPos]){
maxPos = i*2;
}
int right = i*2+1;
if(right<=count && data[right]>data[maxPos]){
maxPos = right;
}
if(maxPos == i){
break;
}
swap(maxPos,i);
i = maxPos;
}
}
private void swap(int i,int j){
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}