在白书中提到了一种O(n)级别的寻找中位数算法 就是我们今天要介绍的主角

快速选择算法

类似快排 选择一个比较元素 进行递归处理寻找第k大元素

假设最后比较元素到了i

以下描述是我写快排的常用字符 所以外人应该看不懂。。。。

如果(i-s+1)<k  去(i+1,t)的区间  递归寻找第(k-(i-s+1)) 大的数

如果(i-s+1)=k 返还i的值即可

如果 (i-s+1)>k 去 (s,i-1)的区间 递归找第k大的数

类似快排的思想 很容易理解

代码如下:

int swap(long long &a,long long &b) {long long temp=a;a=b;b=temp;return 0;}
int quickchoice(long long *A,int s,int t,int k)
{
int i=s,j=t;
long long x=A[s];
while(i<j)
{
while(i<j&&A[j]>=x) j--;
if(i<j) swap(A[i],A[j]),i++;
while(i<j&&A[i]<x) i++;
if(i<j) swap(A[j],A[i]),j--;
}
A[i]=x;
if((i-s+1)==k) return 0;
else if((i-s+1)<k&&i+1<=t) quickchoice(A,i+1,t,k-(i-s+1));
else if((i-s+1)>k&&s<=i-1) quickchoice(A,s,i-1,k);
return 0;
}

UVA11300快速选择算法实现如下:

#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
long long gold[1000100],M;
int cmp(const void *i,const void *j)
{
if(*(long long *)i>*(long long *)j) return 1;
else if(* (long long *)i==*(long long *)j) return 0;
else return -1;
}
int main()
{
int n,k;
long long sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&gold[i]);
sum+=gold[i];
}
M=sum/n;
for(int i=1;i<=n-1;i++)
gold[i]=gold[i-1]+M-gold[i];
gold[n]=0;
qsort(gold+1,n,sizeof(gold[1]),cmp);
k=(n+1)/2;
sum=0;
for(int i=1;i<=n;i++)
sum=sum+abs(gold[i]-gold[k]);
printf("%lld\n",sum);
}
return 0;
}

上面这个方法不知道为何 速度和快排没什么区别。。

但是下面这个就快了一倍

nth_element函数 非常奇怪

好吧 觉得奇怪 是被网上各种奇葩的资料误导了

自己亲手操作后还是懂了

nth_element(begin,kth,end)

在[begin,end)这段区间内找第k大的数 其实这样描述是不精确的

这样描述似乎更合适

比如 nth_element(s+1,s+k,s+n+1)

在[1,n+1)这段区间内 s[k] 左边的全部小于等于他 右边的全部大于等于他

如果 区间从1开始 似乎确实可以描述成 第k个

如果不从1开始就注意点

AC代码如下:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
long long gold[1000100],M;
int n;
int main()
{
int k;
long long sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&gold[i]);
sum+=gold[i];
}
M=sum/n;
for(int i=1;i<=n-1;i++)
gold[i]=gold[i-1]+M-gold[i];
gold[n]=0;
k=(n+1)/2;
nth_element(gold+1,gold+k,gold+1+n);
for(int i=1;i<=n;i++)
printf("gold:%d\n",gold[i]);
sum=0;
for(int i=1;i<=n;i++)
sum=sum+abs(gold[i]-gold[k]);
printf("%lld\n",sum);
}
return 0;
}

【快速选择算法与nth_element函数】【续UVA11300 】的更多相关文章

  1. 选取第K大数的快速选择算法和注意事项

    快速选择算法,是一种能在大致O(N)的时间内选取数组中第k大或者k小的算法.其基本思路与快速排序算法类似,也是分治的思想. 其实这个算法是个基础算法,但是不常用,所以今天编的时候错了POJ2388,才 ...

  2. POJ 2388 Who's in the Middle (快速选择算法:O(N)求数列第K大)

    [题意]求数列中间项. ---这里可以扩展到数列第K项. 第一次做的时候直接排序水过了= =--这一次回头来学O(N)的快速选择算法. 快速选择算法基于快速排序的过程,每个阶段我们选择一个数为基准,并 ...

  3. 求一无序数组中第n大的数字 - 快速选择算法

    逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) #include <v ...

  4. nth_element函数

    使用方法:nth_element(start, start+n, end) 使第n大元素处于第n位置(从0开始,其位置是下标为n的元素),并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都 ...

  5. Java实现 蓝桥杯VIP 算法训练 sign函数

    试题 算法训练 sign函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0, ...

  6. Java实现蓝桥杯VIP算法训练 二元函数

    试题 算法训练 二元函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: ...

  7. KMP算法中next函数的理解

    首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...

  8. C++ STL算法系列6---copy函数

    现在我们来看看变易算法.所谓变易算法(Mutating algorithms)就是一组能够修改容器元素数据的模板函数,可进行序列数据的复制,变换等. 我们现在来看看第一个变易算法:元素复制算法copy ...

  9. C++ STL算法系列1---count函数

    一.count函数 algorithm头文件定义了一个count的函数,其功能类似于find.这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果. 编写程序读取一系列int型数据,并将 ...

随机推荐

  1. Vlc for Android 全面阐述

    简单介绍 Vlc for android是一款开源安卓播放器.具备播放多媒体文件.光盘.设备以及网络流媒体协议等功能,支持ARMv7 CPU或一个x86 CPU的设备,全部播放控制特性都已经开发完整. ...

  2. [转]Laravel 4之验证

    Laravel 4之验证 http://dingjiannan.com/2013/laravel-validation/ 基本验证 使用Validator::make($data, $rules)验证 ...

  3. BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类

    本文假设读者已经基本了解boost线程库的使用方法. boost是个开源工程,线程这一块也在不断完善之中,到现在这个阶段,boost::thread仅仅实现了一个完美的技术框架,但是读者在实际使用中会 ...

  4. Oracle-nomount/mount/open

    通常所说的Oracle Server主要由两个部分组成:Instance和Database.Instance是指一组后台进程(在Windows上是一组线程)和一块共享内存区域:Database是指存储 ...

  5. 关于jQuery获取checkbox状态的问题

    这位大神概括的很好 http://www.cnblogs.com/wangkongming/p/4002710.html

  6. HTML - Textarea - 空格的问题解决方式

    第一种方式: <textarea name="textareaname" rows="XX" cols="XX" ></t ...

  7. React react-ui-tree的使用

    公司需要做一个IDE,要做IDE当然少不了文件列表了.下面我就来展示一下刚刚研究的一个库. 下面是链接:https://react.rocks/example/react-ui-tree 至于如何导入 ...

  8. Biztalk2010安装及配置问题集

    在安装Biztalk2010时,碰到很多问题,有的是粗心有的也是比较bt的,如: 1)在win7 64下引入x86 的cab,有点粗心,幸亏给我报错版本不兼容(呵呵): 2)安装的时候 不知道为什么计 ...

  9. codeforces 519E A and B and Lecture Rooms(LCA,倍增)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud E. A and B and Lecture Rooms A and B are ...

  10. CDZSC_2015寒假新人(2)——数学 G

    G - G Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...