求第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小的数)