MCPcopy Create free account
hub / github.com/codemistic/Data-Structures-and-Algorithms / kthSmallest

Function kthSmallest

CPP/arrays/KthSmallest.cpp:35–71  ·  view source on GitHub ↗

Returns kth smallest element in arr[] in worst case linear time

Source from the content-addressed store, hash-verified

33
34// Returns kth smallest element in arr[] in worst case linear time
35int 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
73int main() {
74 int size, k;

Callers 1

mainFunction · 0.85

Calls 2

findMedianFunction · 0.85
partitionFunction · 0.70

Tested by

no test coverage detected