Top K问题

先贴一个普通的利用快拍的topk算法,后面再详细分析这个问题以及各种情况下的应用

#include<cstdio>
#include<algorithm>
#include<cassert>
#include<map>
#include<iostream>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<cmath>
#include<iostream>
#include<fstream>
#include<sstream>
#include<queue>
using namespace std;

#define DBG false
#define out(x) cout << #x << ":  " << x << "   in line :   " << __LINE__ << endl;

typedef long long int64;

inline int Rint(){int x; scanf("%d", &x); return x;}

// n >= 1
// a[0, p-1] >= a[p] > a[p + 1, n - 1]
int partition(int *a, int n){
    if(n <= 0)
        return -1;
    swap(a[n - 1], a[rand() % n]);
    int target = a[n - 1];
    int p = -1;
    for(int i = 0; i < n; ++ i)
        if(a[i] >= target){
            ++p;
            swap(a[p], a[i]);
        }
    return p;
}

void top_k_sort(int *a, int n, int k){
    if(k <= 0 || k == n)
        return ;
    int p = partition(a, n);
    if(p + 1 == k)
        return;
    if(p + 1 > k)
        top_k_sort(a, p, k);
    else
        top_k_sort(a + p + 1, n - (p + 1), k - (p + 1));
}

int a[] = {1, 3, 2, 1, 2, 6};
int main(){
    top_k_sort(a, 6, 3);
    for(int i = 0; i < 3; ++ i)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值