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

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program of kth smallest/largest in 
// a small range unsorted array
#include <bits/stdc++.h>
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;
}

chevron_right


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

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program of kth smallest/largest in 
// a small range unsorted array
$maxs = 1000001;
   
function kthSmallestLargest(&$arr, $n, $k)
{
    global $maxs;
    $max_val = max($arr);
    $hash = array_fill(0,$max_val+1, NULL);
   
    // Storing counts of elements
    for ($i = 0; $i < $n; $i++) 
        $hash[$arr[$i]]++;    
       
    // Traverse hash array build above until
    // we reach k-th smallest element.
    $count = 0;
    for ($i=0; $i <= $max_val; $i++)
    {
        while ($hash[$i] > 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;
?>

chevron_right


Output:

kth smallest number is: 4

Time Complexity: O(n + max_val)



My Personal Notes arrow_drop_up