#include<iostream>
#include<vector>
#include<cstdlib>
#include<ctime>
using namespace std;
//快速排序算法
int Partition(vector<int> &A, int p, int r)
{
int i, j;
int key, temp;
i = p - 1;
key = A[r]; //The key set A[r] value
for (j = p; j <= r; j++)
{
if (A[j] < key)
{
i += 1;
temp = A[j];
A[j] = A[i];
A[i] = temp;
}
}
temp = A[r];
A[r] = A[i + 1];
A[i + 1] = temp;
return i + 1;
}
int RanPartiton(vector<int> &A, int p, int r) //随机化版本的快速排序
{
int d,c,temp;
d = r - p;
srand((unsigned)time(NULL)); //用于保证是随机数
c = rand() % d;
temp = A[r];
A[r] = A[c];
A[c] = A[r];
return Partition(A, p, r);
}
//输入原始容器,起始P 终点 r 需要查找的位置i
int RanSeletted(vector<int> &A, int p, int r, int i)
{
int q, k;
if (p == r)
return A[p];
q = RanPartiton(A, p, r);
k = q - p + 1;
if (i == k)
return A[q];
if (i < k)
return RanSeletted(A, p, q-1,i);
if (i > k)
return RanSeletted(A, q+1, r, i);
}
int main(void)
{
vector<int> A = { 11, 23, 1415, 13, 156, 167, 13, 661, 3, 1, 3, 51 };
int len = A.size();
int res,i;
cout << "find num" << endl;
cin >> i;
res = RanSeletted(A, 0, len-1, i);
cout << "Num " << i << " is: " << res << endl;
return 0;
}
//时间复杂度最坏为theta(n^2) 期望运行时间为O(n)#include#include#include#includeusing namespace std;//快速排序算法int Partition(vector &A, int p, int r){ int i, j; int key, temp; i = p - 1; key = A[r]; //The