快排nth_element

来源:互联网 发布:2017淘宝热卖产品 编辑:程序博客网 时间:2024/06/05 09:19

多组输入数据

第一行为正整数n(1 <= n <= 100000)

接下来n个int范围内的正整数

对于每组数据,输出一行,为这n个数中的的中位数

本题与平时学的快排求第k大数(小数)一样,只不过k值为中位数下标。本题对时间性能要求高,故应该用STL中的nth_element()。通过调用nth_element(start,start+n,end)方法可以使第n大元素处于第n位置,并且比这个元素小的排在这个元素前面,比这个元素大的排在后面,类似于快排的Partition功能。

#include<cstdio>#include<algorithm>int a[1000000];int main(){    int n;    while(~scanf("%d",&n)){        for(int i=0;i<n;i++)            scanf("%d",&a[i]);            int k=(n%2==1)?n/2:n/2-1;        std::nth_element(a,a+k,a+n);        printf("%d\n",a[k]);    }}
0 0