求第K大数(分治)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求第K大数(分治)相关的知识,希望对你有一定的参考价值。

题意:已知N个数,求第K大数。

分析:

1、复杂度O(n)。

2、利用快排中划分的原理,每次划分以序列中第一个数x为标准,将序列划分为{比x大的数}x{比x小的数}。

3、若集合{比x大的数}中元素为k-1个,则x为第k大数。

若集合{比x大的数}中元素大于k-1个,则第k大数在集合{比x大的数}中,根据分治的思想,继续划分集合{比x大的数}。

若集合{比x大的数}中元素小于k-1个,则x为第k大数在集合{比x小的数}中,根据分治的思想,继续划分集合{比x小的数}。

#include<bits/stdc++.h>
using namespace std;
int a[] = {12, 25, 64, 95, 1234, 852, 15, 66, 153, 123, 324, 513};
int Partition(int L, int R){
    int tmp = a[L];
    int pos = a[L];
    while(L < R){
        while(L < R && a[R] <= pos) --R;
        a[L] = a[R];
        while(L < R && a[L] >= pos) ++L;
        a[R] = a[L];
    }
    a[L] = tmp;
    return L;
}
int Find(int L, int R, int k){
    int tmp = Partition(L, R);
    for(int i = 0; i < 12;++i){
        printf("%d=",a[i]);
    }
    printf("\n");
    if(tmp + 1 == k){
        return a[tmp];
    }
    else if(tmp + 1 > k){
        Find(L, tmp - 1, k);
    }
    else{
        Find(tmp + 1, R, k);
    }
}
int main(){
    int k;
    scanf("%d", &k);
    printf("第%d大数为%d\n", k, Find(0, 11, k));
    return 0;
}

  

以上是关于求第K大数(分治)的主要内容,如果未能解决你的问题,请参考以下文章

快排划分思想的应用-求第k大数或者第k小的数(求前k大数或者前k小的数)

求第k大数

【python滴滴出行】整数无序数组求第K大数?

算法:平衡树求第k大数 Sm 前段时间刚学会了用快速排序来求一个列中的第 k大数,可是她觉得每次 序列被改变

算法导论学习之线性时间求第k小元素+堆思想求前k大元素

[CDQ分治][树状数组][树套树] Jzoj P3197 K大数查询