Performance of quick sort depends on how we choose the pivot. If we choose the pivot as the median of the array then quick sort can run in O(n*logn) time.
In median of medians algorithm, we try to get something close to the median.
Median-of-medians algorithm:
Code
In median of medians algorithm, we try to get something close to the median.
Median-of-medians algorithm:
- Line up elements in groups of five (this number 5 is not important, it could be e.g. 7 without changing the algorithm much). Call each group S[i], with i ranging from 1 to n/5.
- Find the median of each group. (Call this x[i]). This takes 6 comparisons per group, so 6n/5 total (it is linear time because we are taking medians of very small subsets).
- Find the median of the x[i], using a recursive call to the algorithm. If we write a recurrence in which T(n) is the time to run the algorithm on a list of n items, this step takes time T(n/5). Let M be this median of medians.
- Use M to partition the input and call the algorithm recursively on one of the partitions, just like in quickselect.
Code
// selects the median of medians in an array
int select(int *a, int s, int e, int k){
// if the partition length is less than or equal to 5
// we can sort and find the kth element of it
// this way we can find the median of n/5 partitions
if(e-s+1 <= 5){
sort(a+s, a+e);
return s+k-1;
}
// if array is bigger
// we partition the array in subarrays of size 5
// no. of partitions = n/5 = (e+1)/5
// iterate through each partition
// and recursively calculate the median of all of them
// and keep putting the medians in the starting of the array
for(int i=0; i<(e+1)/5; i++){
int left = 5*i;
int right = left + 4;
if(right > e) right = e;
int median = select(a, 5*i, 5*i+4, 3);
swap(a[median], a[i]);
}
// now we have array
// a[0] = median of 1st 5 sized partition
// a[1] = median of 2nd 5 sized partition
// and so on till n/5
// to find out the median of these n/5 medians
// we need to select the n/10th element of this set (i.e. middle of it)
return select(a, 0, (e+1)/5, (e+1)/10);
}
int main(){
int a[] = {6,7,8,1,2,3,4,5,9,10};
int n = 10;
int mom = select(a, 0, n-1, n/2);
cout<<"Median of Medians: " << a[mom] << endl;
return 0;
}
Have you tested it? you did not use the 'ceil' function, and it maybe produces error! for instance,{1,2,3,4,5,6,7,8,9}. And the median is not real median!
ReplyDeleteceil function is required !!! And also The median-of-medians algorithm does not actually compute the exact median, but computes an approximate median, namely a point that is guaranteed to be between the 30th and 70th percentiles
DeleteThis comment has been removed by the author.
ReplyDelete