kth smallest/largest in a small range unsorted array

Find kth smallest or largest element in an unsorted array, where k<=size of array. It is given that elements of array are in small range.

Examples:

```Input : arr[] = {3, 2, 9, 5, 7, 11, 13}
k = 5
Output: 9

Input : arr[] = {16, 8, 9, 21, 43}
k = 3
Output: 16

Input : arr[] = {50, 50, 40}
k = 2
Output: 50
```

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

As the given array elements are in small range, we can direct index table to do something similar to counting sort. We store counts of elements, then we traverse the count array and print k-th element.

Following is the implementation of the above algorithm

C++

 `// C++ program of kth smallest/largest in  ` `// a small range unsorted array ` `#include ` `using` `namespace` `std; ` `#define maxs 1000001 ` ` `  `int` `kthSmallestLargest(``int``* arr, ``int` `n, ``int` `k) ` `{ ` `    ``int` `max_val = *max_element(arr, arr+n); ` `    ``int` `hash[max_val+1] = { 0 }; ` ` `  `    ``// Storing counts of elements ` `    ``for` `(``int` `i = 0; i < n; i++)  ` `        ``hash[arr[i]]++;     ` `     `  `    ``// Traverse hash array build above until ` `    ``// we reach k-th smallest element. ` `    ``int` `count = 0; ` `    ``for` `(``int` `i=0; i <= max_val; i++) ` `    ``{ ` `        ``while` `(hash[i] > 0) ` `        ``{ ` `           ``count++; ` `           ``if` `(count == k) ` `              ``return` `i; ` `           ``hash[i]--; ` `        ``} ` `    ``} ` `     `  `    ``return` `-1; ` `} ` ` `  `int` `main() ` `{ ` `    ``int` `arr[] = { 11, 6, 2, 9, 4, 3, 16 }; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]), k = 3; ` `    ``cout << ``"kth smallest number is: "` `         ``<< kthSmallestLargest(arr, n, k) << endl; ` `    ``return` `0; ` `} `

Python3

# Python 3 program of kth smallest/largest
# in a small range unsorted array

def kthSmallestLargest(arr, n, k):
max_val = arr[0]
for i in range(len(arr)):
if (arr[i] > max_val):
max_val = arr[i]
hash = [0 for i in range(max_val + 1)]

# Storing counts of elements
for i in range(n):
hash[arr[i]] += 1

# Traverse hash array build above until
# we reach k-th smallest element.
count = 0
for i in range(max_val + 1):
while (hash[i] > 0):
count += 1
if (count == k):
return i
hash[i] -= 1

return -1

# Driver Code
if __name__ == ‘__main__’:
arr = [11, 6, 2, 9, 4, 3, 16]
n = len(arr)
k = 3
print(“kth smallest number is:”,
kthSmallestLargest(arr, n, k))

# This code is contributed by
# Surendra_Gangwar

PHP

 ` 0) ` `        ``{ ` `           ``\$count``++; ` `           ``if` `(``\$count` `== ``\$k``) ` `              ``return` `\$i``; ` `           ``\$hash``[``\$i``]--; ` `        ``} ` `    ``} ` `      `  `    ``return` `-1; ` `} ` `  `  ` `  `    ``\$arr` `= ``array` `( 11, 6, 2, 9, 4, 3, 16 ); ` `    ``\$n` `= sizeof(``\$arr``) / sizeof(``\$arr``[0]); ` `    ``\$k` `= 3; ` `    ``echo` `"kth smallest number is: "` `         ``. kthSmallestLargest(``\$arr``, ``\$n``, ``\$k``).``"\n"``; ` `    ``return` `0; ` `?> `

Output:

```kth smallest number is: 4
```

Time Complexity: O(n + max_val)

My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :

1

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.