Returns kth smallest element in arr[] in worst case linear time
| 33 | |
| 34 | // Returns kth smallest element in arr[] in worst case linear time |
| 35 | int kthSmallest(int arr[], int l, int r, int k) { |
| 36 | // If k is smaller than number of elements in array |
| 37 | if (k > 0 && k <= r - l + 1) { |
| 38 | int n = r - l + 1; |
| 39 | |
| 40 | // Divide arr[] in groups of size 5, calculate median |
| 41 | // of every group and store it in median[] array |
| 42 | int i, median[(n + 4) / 5]; |
| 43 | for (i = 0; i < n / 5; i++) |
| 44 | median[i] = findMedian(arr + l + i * 5, 5); |
| 45 | // For the last group |
| 46 | if (i * 5 < n) { |
| 47 | median[i] = findMedian(arr + l + i * 5, n % 5); |
| 48 | i++; |
| 49 | } |
| 50 | |
| 51 | // Find median of all medians using recursive call |
| 52 | int medOfMed = (i == 1) ? median[i - 1] : kthSmallest(median, 0, i - 1, i / 2); |
| 53 | |
| 54 | // Partitioning the array around a random element and |
| 55 | // get position of pivot element in sorted array |
| 56 | int pos = partition(arr, l, r, medOfMed); |
| 57 | |
| 58 | // If position is same as k |
| 59 | if (pos - l == k - 1) |
| 60 | return arr[pos]; |
| 61 | // If position is more, recur for left |
| 62 | if (pos - l > k - 1) |
| 63 | return kthSmallest(arr, l, pos - 1, k); |
| 64 | |
| 65 | // Else recur for right subarray |
| 66 | return kthSmallest(arr, pos + 1, r, k - pos + l - 1); |
| 67 | } |
| 68 | |
| 69 | // If k is more than number of elements in array |
| 70 | return INT_MAX; |
| 71 | } |
| 72 | |
| 73 | int main() { |
| 74 | int size, k; |
no test coverage detected