算法理论基础见《算法导论》的第9章
#include <iostream>
#include <time.h>
using namespace std;
#define NSIZ 1000
int partision(int arr[], int left, int right)
{
int tmp = arr[left];
while(left < right)
{
while(left < right && tmp <= arr[right]) --right;
arr[left] = arr[right];
while(left < right && arr[left] <= tmp) ++left;
arr[right] = arr[left];
}
arr[left] = tmp;
return left;
}
int random(int m, int n)
{
if(m == n)
{
return m;
}
srand(time(0));
return m + ((n - m) * rand()) / RAND_MAX;
}
int RandomPartision(int arr[], int left, int right)
{
int t = random(left, right);
int tmp = arr[t];
arr[t] = arr[left];
arr[left] = tmp;
return partision(arr, left, right);
}
int qsort(int arr[], int left, int right, int n)
{
if (left == right)
{
return arr[left];
}
int i = RandomPartision(arr, left, right);
int k = i - left + 1;
if (k == n)
{
return arr[i];
}
else if (k > n)
{
return qsort(arr, left, i-1, n);
}
else
{
return qsort(arr, i+1, right, n-k);
}
}
int main()
{
int arr[] = {1, 1, 5, 3, 2, 2, 3, 10, 19};
int arrLen = sizeof(arr)/sizeof(arr[0]);
int res = qsort(arr, 0, arrLen - 1, 4);
printf("%d ", res);
return 0;
}