类似于快速排序那种,只不过另加处理一番。
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+5;
int n,a[maxn];
double select_middle(int beg,int end)
{
if(n==1)return a[0];
int i=beg;
for(int j=i+1;j<=end;j++){
if(a[j]<a[beg]){
++i;
swap(a[i],a[j]);
}
}
swap(a[beg],a[i]);
if(i<n/2)return select_middle(i+1,end);
else if(i>n/2)return select_middle(beg,i-1);
else{
if(n%2)return a[i];
else{
int m=a[0];
for(int j=1;j<i;j++){
if(a[j]>m){
m=a[j];
}
}
return (double)(a[i]+m)/2;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
printf("%f\n",select_middle(0,n-1));
return 0;
}
/*
5
3 2 1 4 5
4
2 1 3 4
*/