最小的k个数

#include 
#include 
#include 
#include 

using namespace std;

//全排序
//复杂度O(n*logn)
vector Full_sorting(vector input, int k) {
   vector res;
   if(input.empty()||k>input.size()||k<=0) return res;

   sort(input.begin(),input.end());

   for(int i=0;i Max_Heap(vector input, int k) {
   int len=input.size();
   if(len<=0||k>len||k<=0) return vector();

   vector res(input.begin(),input.begin()+k);
   //for (int i = 0; i < k; i++) result.push_back(input[i]);
   make_heap(res.begin(),res.end());
   for(int i=k;im)
//所以综合来讲,最大堆解决这种方法比最小堆有优势
//算法改进:每次取走堆顶元素更新堆时,正常是把堆中最后一个元素放到堆顶,
//然后调整堆将其下调到他应该在的位置。改进后,此元素不用下调到他原所应该在的位置,
//而是下调顶多K次就可以了。

//红黑树 原理上讲没看出和最大堆不同,写法上区别,可能因为对红黑树不了解
//复杂度O(nlogk)
vector Red_and_black_Trees(vector input, int k) {
   int len=input.size();
   if(len<=0||k>len||k<=0) return vector();

   //multiset sbt;         //默认小到大
   //multiset > sbt; //定义大到小
   //sbt.empty()      //判断是否有元素
   //sbt.insert(x)    //插入x元素
   //sbt.erase(x);    //删除x元素
   //sbt.size(x)      //x元素有多少个
   //sbt.begin()       //第一个元素*(sbt.begin())
   multiset > leastNums;
   vector::iterator vec_it=input.begin();
   for(;vec_it!=input.end();vec_it++){
       if(leastNums.size() >::iterator greatest_it=leastNums.begin();
           if(*vec_it<*(leastNums.begin())){
               leastNums.erase(greatest_it);
               //leastNums.erase(*greatest_it);也可以
               //删除时均ok,插入时必须加*
               leastNums.insert(*vec_it);
           }
       }
   }
   return vector(leastNums.begin(),leastNums.end());
}

int main()
{
    int a[] = {10,20,30,5,15};
    vector v(a,a+5);
    vector r;
    vector::iterator it;
    int k=3;
    //r = Red_and_black_Trees(v,k);
    //r = Full_sorting(v,k);
    r = Max_Heap(v,k);

    for(it=r.begin();it!=r.end();it++){
     cout << *it << ' ';
    }
    cout << endl;
    return 0;
}

参考:

[1] https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
[2]https://www.jianshu.com/p/5ad9ca0e3cf6

你可能感兴趣的:(最小的k个数)