给定n个元素和1个k,1<=k<=n,要求找出这n个元素中第k小的元素。
下面讨论解一般的选择问题的分冶算法,实际是模仿快速排序算法,不同的是,只对划分出的子数组之一进行递归处理。
#include <iostream>
#include <stdio.h>
#include <time.h>
using namespace std;
int randomSelect(int a[], int p, int r, int k);
int randomPartition(int a[], int p, int r);
int myPartition(int a[], int p, int r);
int main()
{
int a[10] = {5, 8, 50, 47, 63, 12, 30, 19, 9, 25};
int m = randomSelect(a, 0, 9, 5);
cout << m;
}
int randomSelect(int a[], int p, int r, int k){
if(p == r) return a[p];
int i = randomPartition(a, p, r);
int j = i - p + 1;
if(k <= j) return randomSelect(a, p, i, k);
else return randomSelect(a, i + 1, r, k - j);
}
int randomPartition(int a[], int p, int r){
srand(time(0));
int i = p + rand() % (r - p + 1);
int temp = a[i];
a[i] = a[p];
a[p] = temp;
return myPartition(a, p, r);
}
int myPartition(int a[], int p, int r){
int i = p, j = r + 1;
int x = a[p];