kth smallest/largest in a small range unsorted array
Last Updated :
07 Sep, 2022
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 a small range, we can direct the 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.
Implementation: Following is the implementation of the above algorithm
C++
#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 };
for ( int i = 0; i < n; i++)
hash[arr[i]]++;
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;
}
|
Java
import java.util.Arrays;
class GFG
{
static int maxs = 1000001 ;
static int kthSmallestLargest( int [] arr, int n, int k)
{
int max_val = Arrays.stream(arr).max().getAsInt();
int hash[] = new int [max_val + 1 ];
for ( int i = 0 ; i < n; i++)
{
hash[arr[i]]++;
}
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 ;
}
public static void main(String[] args)
{
int arr[] = { 11 , 6 , 2 , 9 , 4 , 3 , 16 };
int n = arr.length, k = 3 ;
System.out.println( "kth smallest number is: "
+ kthSmallestLargest(arr, n, k));
}
}
|
Python3
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 )]
for i in range (n):
hash [arr[i]] + = 1
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
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))
|
C#
using System;
using System.Linq;
class GFG
{
static int maxs = 1000001;
static int kthSmallestLargest( int [] arr, int n, int k)
{
int max_val = arr.Max();
int []hash = new int [max_val + 1];
for ( int i = 0; i < n; i++)
{
hash[arr[i]]++;
}
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;
}
public static void Main()
{
int []arr = {11, 6, 2, 9, 4, 3, 16};
int n = arr.Length, k = 3;
Console.WriteLine( "kth smallest number is: "
+ kthSmallestLargest(arr, n, k));
}
}
|
PHP
<?php
$maxs = 1000001;
function kthSmallestLargest(& $arr , $n , $k )
{
global $maxs ;
$max_val = max( $arr );
$hash = array_fill (0, $max_val +1, NULL);
for ( $i = 0; $i < $n ; $i ++)
$hash [ $arr [ $i ]]++;
$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;
?>
|
Javascript
<script>
let maxs = 1000001;
function kthSmallestLargest(arr,n,k)
{
let max_val = Math.max(...arr);
let hash = new Array(max_val + 1);
for (let i=0;i<hash.length;i++)
{
hash[i]=0;
}
for (let i = 0; i < n; i++)
{
hash[arr[i]]++;
}
let count = 0;
for (let i = 0; i <= max_val; i++)
{
while (hash[i] > 0)
{
count++;
if (count == k)
{
return i;
}
hash[i]--;
}
}
return -1;
}
let arr=[11, 6, 2, 9, 4, 3, 16];
let n = arr.length, k = 3;
document.write( "kth smallest number is: "
+ kthSmallestLargest(arr, n, k));
</script>
|
Output
kth smallest number is: 4
Complexity Analysis:
- Time Complexity: O(n + max_val)
- Auxiliary Space: O(n) for hash array.
Share your thoughts in the comments
Please Login to comment...