中值选择算法

时间:2012-09-03 07:51:58

标签: c++ selection median

这是我的中位选择代码版本

#include<iostream>
using namespace std;
#define max 1000
int a[max];
int n;//number of elements
void Swap(int i,int j)
{
    int k=a[i];
    a[i]=a[j];
    a[j]=k;


}
int randint(int l, int u)
{   return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}

void read()
{
    cout<<"  enter number of elements ";
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];

}

void select(int l,int u,int k)
{
    int i,j;
    int t,temp;
    if(l>=u)
         return;
    Swap(l,randint(l,u));
    t=a[l];
    i=l;
    j=u+1;
    for(;;)
    {
        do i++; while(i<=u && a[i]<t);
        do j--;while(a[j]>t);
        if(i>j)
             break;
        temp=a[i];a[i]=a[j];a[j]=temp;
    }
    Swap(i,j);
    if(j<k)
        select(j+1,u,k);
    else if(j>k)
        select(l,j-1,k);



}
int main()
{
    read();
    int l=0;
    int u=n-1;
    int k=int(n/2);
    select(l,u,k);
    if((n&1)==1)
        cout<<a[k]<<endl;
    else
        cout<<(a[k]+a[k-1])/2<<endl;


    return 0;
}

但是当我运行此代码时,我输入了元素5和输入数

5 3 1 7 2

结果是5,我不会丢脸为什么它会显示我5?我认为结果必须是3不是吗?

1 个答案:

答案 0 :(得分:9)

如果您有兴趣以最少的麻烦计算中位数,我建议使用具有线性复杂度的std::nth_element。这是一个奇数大小的矢量示例,很容易适应阵列使用,但我建议您调整代码以使用std::vector

#include <algorithm> // for std::nth_element
#include <vector> // for std::vector

std::vector<int> v = ....;
size_t midIndex = v.size()/2;
std::nth_element(v.begin(), v.begin() + midIndex, v.end());

中值是

v[midIndex];

这也很容易适用于覆盖偶数阵列的情况。