中位数的中位数不能正常工作
median of medians not working properly
我正在为中位数算法的中位数编写 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);
}
你可能想要 return A[a]
在第一个 if
:
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);
我正在为中位数算法的中位数编写 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);
}
你可能想要 return A[a]
在第一个 if
:
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);