算导 快速选择第i小元素

来源:互联网 发布:卖淘宝号属于犯法吗 编辑:程序博客网 时间:2024/05/21 22:55
#include <iostream>#include <vector>#include <random>using namespace std;default_random_engine e;uniform_int_distribution<unsigned> u(0, 9);int partition(vector<int> &A, int p, int r){int i = p - 1;for (int j = p; j < r; ++j){if (A[j] <= A[r]){swap(A[++i], A[j]);}}swap(A[i+1], A[r]);return i+1;}int random_partition(vector<int> &A, int p, int r){int random = p + u(e) % (r - p + 1);swap(A[random], A[r]);return partition(A, p, r);}int random_select(vector<int> &A, int p, int r, int i){if (p == r){return A[p];}int q = random_partition(A, p , r);int k = q - p + 1;if (i == k){return A[q];}else if (i < k){return random_select(A, p, q-1, i);}else{return random_select(A, q+1, r, i-k);}return 0;}int main(){vector<int> A = {9,8,7,6,5,4,3,2,1,0};cout << "第一个小的元素为 : ";cout << random_select(A, 0, 9, 1) << endl;return 0;}

0 0