K番目の大きい要素を探します
#include <iostream>
#include <vector>
using namespace std;
#define EXCHANGE(a,b) \
({typeof(a) _tmp; \
_tmp=a; \
a=b; \
b=_tmp;})
template <typename T>
int Partition(vector<T>& arr,int p,int r){
int x=arr[r];
int i=p-1;
int j=0;
for(j=p;j<=r-1;j++){
if(arr[j]<=x){
i=i+1;
EXCHANGE(arr[i],arr[j]);
}
}
EXCHANGE(arr[i+1],arr[r]);
return i+1;
}
template <typename T>
void FIND_K(vector<T>& arr,int first,int last,int K){
int index;
index = Partition(arr,first,last-1);
if(index == K)
return;
else if(K < index)
FIND_K(arr,first,index,K);
else
FIND_K(arr,index+1,last,K);
return;
}
int main()
{
int arr[] = {250,300,350,400,400,\
450,500,500,550,650,\
655,700,725,735,750};
int K;
int N = sizeof(arr)/sizeof(int);
vector<int> Arry(arr,arr+N);
K = N/2;
FIND_K(Arry,0,N,K);
cout<<Arry[K]<<endl;
return 0;
}
ソートされていない配列のセットからK番目の大きな要素を見つけるには、迅速なソートの考え方でソート量を半分に減らすことができます.