俊介三

一天更新一点,一天积累一点

导航

查找最小的k个元素

Posted on 2013-03-27 21:20  俊介三在前进  阅读(110)  评论(0编辑  收藏  举报

题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

(当然:涉及真正工程项目不会这样”就事论事“,还要看为什么要找其中最小K个?这K个需不需要排序了?以后会不会变成找最大K个?等问题,要考虑到业务原因。直接给它用O(nlogn)排序好了!)

思路:就遍历一遍这n个数,每次尝试放入容量为k的优先队列中。不知道这个复杂度怎么算?貌似维护一个长度为k的优先队列复杂度是O(klogk)吗?这样O(nklogk)比O(nlogn)优吗?!不知道  :(

#include <stdio.h>
#include <queue>
using namespace std;

void findSmallestK(int* arr, int len, int k){
    priority_queue<int> pq;
    int i;
    for(i=0;i<len;i++){
        if(pq.size()>=k){
            if(pq.top()>arr[i]){
                pq.pop();
                pq.push(arr[i]);
            }
        }else{
            pq.push(arr[i]);
        }
    }
    while(!pq.empty()){
        printf("%d ",pq.top());
        pq.pop();
    }
}

int main(){
    int arr[]={1,2,3,4,5,6,7,8};
    findSmallestK(arr,8,4);
    return 0;
}