-
1、找出最小的k個數
輸入n個數,找出其中最小的k個數
- 使用快速排序中的partition函數,時間復雜度為o(n),需調整數組位置
每進行一輪排序看返回的結點是否為第k個數,若為,則k左邊都比k小,k右邊都比k大,這時返回前k個數就好了
void getLeaseNumbers(int []input,int n,int k){
int[] output=new int[k];
if(input==null||k>n||n<=0||k<=0)return ;
int start=0;
int end=n-1;
int index =Partition(input,n,start,end);
while(index!=k-1){
if(index>k-1){
end=index-1;
index = Partition(input,n,start,end);
}else{
start=index+1;
index = Partition(input,n,start,end);
}
}
for(int i=0;i<k;i++){
output[i]=input[i];
}
}
2)若初始數組不能允許排序,則可使用一個大根堆進行實現。時間復雜度為o(nlogk),適合海量數據
首先構建一個容量為k的堆,然后從n個數據中繼續讀取數據,大根堆中的堆頂為最大值,將該值和從n中取出的值相比較,若堆頂元素更大,則將其刪除,插入從n中取出的數據,然后再調整堆。
3)使用PriorityQueue模擬大根堆
http://blog.csdn.net/jiutianhe/article/details/41441881
public class FixSizedPriorityQueue <E extends Comparable<E>>{
private PriorityQueue<E> queue;
private int maxSize;// 堆的最大容量
public FixSizedPriorityQueue(int maxSize) {
if(maxSize <=0){
throw new IllegalArgumentException();
}
this.maxSize = maxSize;
this.queue =new PriorityQueue<E>(maxSize,new Comparator<E>() {
// 生成最大堆使用o2-o1,生成最小堆使用o1-o2, 并修改 e.compareTo(peek) 比較規則
public int compare(E o1, E o2) {
return(o2.compareTo(o1));
}
});
}
public void add(E e){
if(queue.size() < maxSize) {// 未達到最大容量,直接添加
queue.add(e);
}else{// 隊列已滿
E peek = queue.peek();
if(e.compareTo(peek) <0) {// 將新元素與當前堆頂元素比較,保留較小的元素
queue.poll();
queue.add(e);
}
}
}