0

最悪の場合の線形時間で k 番目に小さい要素を見つけるために、Median of Medians アルゴリズムの C コードを書いています。コードのクイック ソート、スワッピングなどをチェックしました。

与えられた入力 -

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);
}
4

1 に答える 1

0

A[a]おそらく最初に戻りたいでしょうif

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

呼び出しaの 2 番目のインデックスに欠落があります。find_median

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);
于 2015-10-08T17:22:23.023 に答える