【问题标题】:median of medians not working properly中位数的中位数不能正常工作
【发布时间】:2015-10-08 16:29:44
【问题描述】:

我正在为 Median of Medians 算法编写 C 代码,以在最坏的线性时间内找到第 k 个最小的元素。 我已经检查了快速排序、交换等的代码。 一切看起来都不错,但每次都无法正常工作。

输入给定 -

n=12 kth=7
A[]=53 22 65 18 89 45 42 63 99 11 36 55

输出 -

Smallest at k=7 is 89

但输出需要是

Smallest at k=8 is 53

函数调用-

med_of_medians(A,0,n-1,kth);

代码-

int med_of_medians(int A[], int a, int b, int kth)
{
if(a==b)
    return 0;
int n=(b-a+1),median,pos,rank;
int i,med[(n+4)/5];
for(i=0;i<n/5;i++)
    med[i]=find_median(A,(i*5)+a,((i+1)*5)-1);
if(n%5>0)
    med[i++]=find_median(A,(n/5)*5+a,b);
median=(i==1)?med[0]:find_median(med,0,i-1);
pos=partition(A,a,b,median);
rank=pos-a+1;   
if(rank==kth)
    return A[pos];
else if(rank>kth)
    return med_of_medians(A,a,pos-1,kth);
else
    return med_of_medians(A,pos+1,b,kth-pos-1);
}

【问题讨论】:

  • 我又更新了答案:a 还应该添加到递归med_of_medians 调用中的新排名。

标签: c median-of-medians


【解决方案1】:

您可能希望在第一个if 中返回A[a]

if (a == b)
    return A[a];

find_median 调用的第二个索引中缺少a

med[i]=find_median(A,(i*5)+a, a +((i+1)*5)-1);

还应添加a 以进行新排名计算(应为kth - rank):

return med_of_medians(A,pos+1,b,kth-pos-1 +  a);

【讨论】:

  • 应该是return A[a]; 0 可能不在范围内。
  • 谢谢。我把最后一个改成return med_of_medians(A,pos+1,b,kth-rank);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多