0

I'm writing C code for the Median of Medians algorithm to find the kth smallest element in worst case linear time. I've checked my code for Quick Sort, Swapping, etc. Everything looks good but still it is not working properly every time.

Input given -

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

Output -

Smallest at k=7 is 89

but output needs to be

Smallest at k=8 is 53

Function call -

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

Code -

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);
}
Mark Ben
  • 177
  • 1
  • 1
  • 14
  • I updated the answer by one more fix: `a` should be also added for the new rank in recursive `med_of_medians` call. – Orest Hera Oct 08 '15 at 18:01

1 Answers1

0

You probably want to return A[a] in the first if:

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

There is missing a in the second index in the find_median call:

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

and also a should be added for the new rank calculation (it should be kth - rank):

return med_of_medians(A,pos+1,b,kth-pos-1 +  a);
Orest Hera
  • 6,706
  • 2
  • 21
  • 35