快速查找中位数(期望O(N)的算法)

类似于快速排序那种,只不过另加处理一番。

附上代码:

#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
*/

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/87907488