#include<iostream>
#include<vector>
#include<algorithm>
#include<time.h>
using namespace std;
int randomized_partition(vector<int>& vec, int le, int ri)
{
if (le == ri)
{
return le;
}
srand(time(NULL));
int _rand = le + rand() % (ri - le);
int X = vec[_rand]; //基准数
int i = le - 1, j = le;
swap(vec[_rand], vec[ri]);
while (j < ri)
{
if (vec[j] < X)
{
++i;
swap(vec[i], vec[j]);
}
++j;
}
swap(vec[i + 1], vec[j]);
return i + 1;
} int randomized_select(vector<int>& vec, int le, int ri, int i)
//选择[le,ri]中第i小的元素,O(n)时间期望,i不是索引值
{
if (le == ri)
{
return vec[le];
}
int mi = randomized_partition(vec, le, ri);
int interval = mi - le + 1;
if (i < interval)
{
return randomized_select(vec, le, mi - 1, i);
}
else
{
if (i == interval)
{
return vec[mi];
}
else
{
return randomized_select(vec, mi + 1, ri, i - interval);
}
}
} int main()
{
srand(time(NULL));
vector<int>vec(100);
for (int i = 0; i < 100; ++i)
{
vec[i] = rand() % 100;
}
cout << randomized_select(vec, 0, 99, 6) << endl;
sort(vec.begin(), vec.end());
for (int i = 0; i < 100; ++i)
{
cout << vec[i] << " ";
}
system("pause");
}

最新文章

  1. MySQL基础之索引
  2. JavaScript中事件和属性有什么区别吗?或者说事件与方法有什么区别?
  3. HDU 2069 Coin Change(完全背包变种)
  4. Linux命令:修改文件权限命令chmod、chgrp、chown的区别
  5. 京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(下)
  6. Codeforces Round #363 LRU(概率 状压DP)
  7. jQuery里ajax的用法
  8. linux下svn命令大全
  9. Which Python memory profiler is recommended
  10. iTween
  11. Fidder 监控WCF
  12. Git教程(9)集中式工作方式常用的设计分支的方案
  13. sql标准化的后缀
  14. PC-hosts 的使用 [可使电脑无法正常上网]
  15. apache 网址重定向
  16. codevs 3044 矩形面积求并 (扫描线)
  17. 达内TTS6.0课件oop_day05
  18. LeetCode第[16]题(Java):3Sum Closest 标签:Array
  19. method.invoke()s
  20. Activity简说

热门文章

  1. Python类的特殊成员方法
  2. JS添加和删除表格行
  3. java学习笔记之集合—ArrayList源码解析
  4. react-发表评论案例
  5. php 公众号开发
  6. splice删除元素后返回的是一个数组
  7. centos8 apache+mysql+php
  8. java序列化与反序列化的使用
  9. JavaWeb学习(三) : 如何在 Eclipse 中创建一个Web 项目并成功运行?
  10. Django文件夹