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