

大概是最简单并且最优的解法?一般都是对数组进行排序之后选出中位数,但是其实只要找到最中间的数,中位数两边的数字是没有必要排序的
算法大致步骤:首先选定一个数,假定为中位数,在边界里遍历其他数字,把比它小的扔到左边,比它大的扔到右边,遍历一次之后,如果这个数刚好是数组的中位数就返回结果,如果这个数在中位数的左边,记录该位置为左边界,往右边找中位数,假定右边第一个数是中位数,重复遍历过程,如果在中位数的右边,记录该位置为右边界,假定左边第一个数是中位数,重复以上过程直到找到中位数
cpp
ElementType Median( ElementType A[], int N ){
ElementType t;
int i=0;
int k=1;
int min=0;
int max=N-1;
while(1){
for(int j=i+k;j>=min&&j<=max;j+=k){
if(A[i]*k>A[j]*k){
t=A[j];
for(int r=j;r*k>i*k;r-=k){
A[r]=A[r-k];
}
A[i]=t;
i+=k;
}
}
if(i==N/2){
break;
}
if(i<N/2){
i++;
k=1;
min=i;
}
if(i>N/2){
i--;
k=-1;
max=i;
}
}
return A[i];
}