/*第k小元*/
#include <iostream>
#include <cstdlib>
using namespace std;
#define N 10
int a[N]={1,3,5,6,3,8,9,10,11,23};
void swap(int i,int j);
int partition(int begin,int end);
void select(int k,int &x);
void print();
int main(){
int x;
select(4,x);
cout << x;
return 0;
}
void select(int k,int &x){
int j,begin=0,end=N-1;
do{
j = rand()%(end-begin+1)+begin;
/*产生随机数在begin-end中*/
swap(j,begin);
j = partition(begin,end);
if(k == j+1){
x = a[j];
return;
}else if(k < j+1){
end = j;
}else{
begin = j+1;
}
}while(begin <= end);
}
int partition(int begin,int end){
int i = begin,j = end+1;
do{
do{
i++;
}while(a[i] < a[begin]);
do{
j--;
}while(a[j] > a[begin]);
if(i <= j){
swap(i,j);
}
}while(i<=j);
swap(begin,j);
return j;
}
void swap(int i,int j){
int tmp;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
第k小元
最新推荐文章于 2023-05-03 09:58:36 发布