查找第k个数字的位置

时间:2022-04-26 12:41:14

今天读到一篇文章:
http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=importance_of_algorithms

其中提到用随机算法找数组中第k大数字,于是试着写了一下:

查找第k个数字的位置#include  < vector >
查找第k个数字的位置#include 
< set >
查找第k个数字的位置
查找第k个数字的位置
using   namespace  std;
查找第k个数字的位置
查找第k个数字的位置#include 
< cstdlib >
查找第k个数字的位置#include 
< cassert >
查找第k个数字的位置size_t rand(size_t maxn)
查找第k个数字的位置查找第k个数字的位置
{
查找第k个数字的位置    size_t d 
= RAND_MAX / maxn;
查找第k个数字的位置    size_t nd 
= d * maxn;
查找第k个数字的位置    size_t r;
查找第k个数字的位置    
do r = rand(); while(r >= nd);
查找第k个数字的位置    
return r % maxn;
查找第k个数字的位置}

查找第k个数字的位置
int  rand( int  a,  int  b)
查找第k个数字的位置查找第k个数字的位置
{
查找第k个数字的位置    assert(a 
< b);
查找第k个数字的位置    
return (int)rand(b - a) + a;
查找第k个数字的位置}

查找第k个数字的位置
查找第k个数字的位置template
< typename T >
查找第k个数字的位置size_t kthElement(
const  vector < T >   & v, size_t k)
查找第k个数字的位置查找第k个数字的位置
{
查找第k个数字的位置    vector
<size_t> s(v.size());
查找第k个数字的位置    
for (size_t i = 0; i < v.size(); i++)
查找第k个数字的位置        s[i] 
= i;
查找第k个数字的位置    
查找第k个数字的位置    size_t curK 
= k;
查找第k个数字的位置    size_t t;
查找第k个数字的位置    
查找第k个数字的位置    
for(;;)
查找第k个数字的位置查找第k个数字的位置    
{
查找第k个数字的位置        size_t c 
= 0;
查找第k个数字的位置        t 
= rand(s.size());
查找第k个数字的位置        
const T &value = v[s[t]];
查找第k个数字的位置        
for (vector<size_t>::const_iterator it = s.begin(); it != s.end(); ++it)
查找第k个数字的位置查找第k个数字的位置        
{
查找第k个数字的位置            
if (v[*it] < value)
查找第k个数字的位置                c
++;
查找第k个数字的位置        }

查找第k个数字的位置        
if (c == curK)
查找第k个数字的位置            
break;
查找第k个数字的位置        swap(s[t], s.back());
查找第k个数字的位置        s.pop_back();
查找第k个数字的位置        
// now, the v[s[t]] is c-th element of the rest v
查找第k个数字的位置
        if (c > curK)
查找第k个数字的位置查找第k个数字的位置        
{   
查找第k个数字的位置            
// target is smaller than v[s[t]]
查找第k个数字的位置            
// remove greater values from s
查找第k个数字的位置            
// s.erase(remove_if(s.begin(), s.end(), bind2st(greater<T>(), value)), s.end());
查找第k个数字的位置
            for (vector<size_t>::iterator it = s.begin(); it != s.end();)
查找第k个数字的位置查找第k个数字的位置            
{
查找第k个数字的位置                
if (v[*it] > value)
查找第k个数字的位置                    swap(
*it, s.back()), s.pop_back();
查找第k个数字的位置                
else
查找第k个数字的位置                    
++it;
查找第k个数字的位置            }

查找第k个数字的位置        }

查找第k个数字的位置        
else if (c < curK)
查找第k个数字的位置查找第k个数字的位置        
{
查找第k个数字的位置            
// target is greater than v[s[t]]
查找第k个数字的位置            
// remove smaller values from s
查找第k个数字的位置
            for (vector<size_t>::iterator it = s.begin(); it != s.end();)
查找第k个数字的位置查找第k个数字的位置            
{
查找第k个数字的位置                
if (v[*it] < value)
查找第k个数字的位置                    swap(
*it, s.back()), s.pop_back();
查找第k个数字的位置                
else
查找第k个数字的位置                    
++it;
查找第k个数字的位置            }

查找第k个数字的位置            curK 
-= c + 1;
查找第k个数字的位置        }

查找第k个数字的位置        
else
查找第k个数字的位置            
break;
查找第k个数字的位置    }

查找第k个数字的位置    
return s[t];
查找第k个数字的位置}

查找第k个数字的位置
查找第k个数字的位置template
< typename T >
查找第k个数字的位置T median(
const  vector < T >   & v)
查找第k个数字的位置查找第k个数字的位置
{
查找第k个数字的位置    size_t s 
= v.size();
查找第k个数字的位置    
if (s & 1)
查找第k个数字的位置查找第k个数字的位置    
{
查找第k个数字的位置        
return v[kthElement(v, s / 2)];
查找第k个数字的位置    }

查找第k个数字的位置    T a 
= v[kthElement(v, s / 2 - 1)];
查找第k个数字的位置    T b 
= v[kthElement(v, s / 2)];
查找第k个数字的位置    
return (a + b) / 2;
查找第k个数字的位置}

查找第k个数字的位置
查找第k个数字的位置#include 
< cstdio >
查找第k个数字的位置#include 
< algorithm >
查找第k个数字的位置
查找第k个数字的位置
int  main()
查找第k个数字的位置查找第k个数字的位置
{
查找第k个数字的位置    
int n;
查找第k个数字的位置    
while(scanf("%d"&n) == 1)
查找第k个数字的位置查找第k个数字的位置    
{
查找第k个数字的位置        
查找第k个数字的位置        
int t;
查找第k个数字的位置        vector
<int> v;
查找第k个数字的位置        
for (int i = 0; i < n; i++)
查找第k个数字的位置查找第k个数字的位置        
{
查找第k个数字的位置            
//    scanf("%d", &t);
查找第k个数字的位置
            v.push_back(i);
查找第k个数字的位置            
//v.push_back(t);
查找第k个数字的位置
        }

查找第k个数字的位置        random_shuffle(v.begin(), v.end());
查找第k个数字的位置        
//printf("%d\n", v[kthElement(v, n / 2)]);
查找第k个数字的位置
        printf("%d\n", median(v));
查找第k个数字的位置    }

查找第k个数字的位置    
查找第k个数字的位置    
return 0;
查找第k个数字的位置}