这是我的中位选择代码版本
#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不是吗?
答案 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];
这也很容易适用于覆盖偶数阵列的情况。