输出数组中第i大的数(非排序) C++实现
来源:互联网 发布:淘宝怎样开通直通车 编辑:程序博客网 时间:2024/06/05 11:41
输出数组中第i大的数(非排序) C++实现
注:需要C++11的支持。
使用期望为线性时间的选择算法实现。此算法是以快速排序随机版为模型。
源代码:
#include <iostream>#include <vector>#include <random>#include <algorithm>using namespace std;vector<long long> Random() { static default_random_engine e; static uniform_int_distribution<long long> u(-100000000, 100000000); vector<long long> v1; for (auto i = 0; i != 10000; ++i) { v1.push_back(u(e)); } return v1;}size_t Random_Partition(vector<long long> &v1, size_t p, size_t r) { auto ri = p + rand() % (r - p + 1); swap(v1[ri], v1[r]); auto i = p - 1; for (auto j = p; j != r; j++) { if (v1[j] >= v1[r]) { ++i; swap(v1[i], v1[j]); } } swap(v1[i + 1], v1[r]); return i + 1;}long long Randomized_Select(vector<long long> &v1, size_t p, size_t r, size_t i) { if (p == r) { return v1[p]; } auto q = Random_Partition(v1, p, r); auto k = q - p + 1; if (i == k) { return v1[q]; } else if (i < k) { return Randomized_Select(v1, p, q - 1, i); } else { return Randomized_Select(v1, q + 1, r, i - k); }}long long Randomized_Select(vector<long long> &v1, long long i) { return Randomized_Select(v1, 0, v1.size() - 1, i);}int main() { vector<long long> v1 = Random(); cout << Randomized_Select(v1, 1) << endl; //输出第一大的数。 /*sort(v1.begin(), v1.end()); for (auto &i : v1) { cout << i << " "; }*/ return 0;}
0 0
- 输出数组中第i大的数(非排序) C++实现
- 寻找数组中第i小的数(C++)
- 算法之求数组中第i大的数
- 算法设计:如何求数组中第i大 或 第i小的数 (续上)
- 《算法导论》CLRS算法C++实现(九)P109 选择数组中第i小(大)的数 顺序统计量
- 线性时间选出一个数组中第i大的数
- 数组中第k大的数
- 数组中第K大的数
- 数组中第K大的数
- 算法题(一)--找出数组中第k大的数并输出其下标(数组中的数有重复)
- 利用快速排序思想找出数组中第K大的数
- 【算法实现】查找第i大的数
- Next Greater Element I(在数组中找到比给定数大的下一个数)
- 两个排序数组第k大的数
- 在数组中选择第i小的数
- 随机访问数组中第i大的元素
- 求数组中第k大的数的位置
- java实现通过快速排序来查找数组中第n大的元素
- Linux 安装
- hadoop的安装
- 移动前端不得不了解的HTML5 head 头标签(2016最新版)
- 【PAT甲级】1035. Password (20)
- Java中将数据导出到Excel
- 输出数组中第i大的数(非排序) C++实现
- Private 的重新认识
- HDU_2717_Catch That Cow
- 找出下一个比它大而且值为1的位元数与之相同的数字
- 文章标题
- unix线程同步
- 使用C#创建快捷方式
- XUtils之HttpUtils
- Java基础1