k smallest elements in same order using O(1) extra space
We are given an array of n-elements you have to find k smallest elements from the array but they must be in the same order as they are in the given array and we are allowed to use only O(1) extra space.
Examples:
Input : arr[] = {4, 2, 6, 1, 5}, k = 3 Output : 4 2 1 Explanation : 1, 2 and 4 are three smallest numbers and 4 2 1 is their order in given array
Input : arr[] = {4, 12, 16, 21, 25}, k = 3 Output : 4 12 16 Explanation : 4, 12 and 16 are 3 smallest numbers and 4 12 16 is their order in given array
We have discussed an efficient solution to find n smallest elements of the above problem by using extra space of O(n). To solve it without using any extra space we will use the concept of insertion sort.
The idea is to move k minimum elements to begin in the same order. To do this, we start from the (k+1)-th element and move to the end. For every array element, we replace the largest element of the first k elements with the current element if the current element is smaller than the largest. To keep the order, we use the insertion sort idea.
The flowchart is as follows:

Flowchart- printsmall
Implementation:
C++
// CPP for printing smallest k numbers in order #include <algorithm> #include <iostream> using namespace std; // Function to print smallest k numbers // in arr[0..n-1] void printSmall( int arr[], int n, int k) { // For each arr[i] find whether // it is a part of n-smallest // with insertion sort concept for ( int i = k; i < n; ++i) { // find largest from first k-elements int max_var = arr[k - 1]; int pos = k - 1; for ( int j = k - 2; j >= 0; j--) { if (arr[j] > max_var) { max_var = arr[j]; pos = j; } } // if largest is greater than arr[i] // shift all element one place left if (max_var > arr[i]) { int j = pos; while (j < k - 1) { arr[j] = arr[j + 1]; j++; } // make arr[k-1] = arr[i] arr[k - 1] = arr[i]; } } // print result for ( int i = 0; i < k; i++) cout << arr[i] << " " ; } // Driver program int main() { int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 }; int n = sizeof (arr) / sizeof (arr[0]); int k = 5; printSmall(arr, n, k); return 0; } |
Java
// Java for printing smallest k numbers in order import java.lang.*; import java.util.*; public class GfG { // Function to print smallest k numbers // in arr[0..n-1] public static void printSmall( int arr[], int n, int k) { // For each arr[i] find whether // it is a part of n-smallest // with insertion sort concept for ( int i = k; i < n; ++i) { // Find largest from top n-element int max_var = arr[k - 1 ]; int pos = k - 1 ; for ( int j = k - 2 ; j >= 0 ; j--) { if (arr[j] > max_var) { max_var = arr[j]; pos = j; } } // If largest is greater than arr[i] // shift all element one place left if (max_var > arr[i]) { int j = pos; while (j < k - 1 ) { arr[j] = arr[j + 1 ]; j++; } // make arr[k-1] = arr[i] arr[k - 1 ] = arr[i]; } } // print result for ( int i = 0 ; i < k; i++) System.out.print(arr[i] + " " ); } // Driver function public static void main(String argc[]) { int [] arr = { 1 , 5 , 8 , 9 , 6 , 7 , 3 , 4 , 2 , 0 }; int n = 10 ; int k = 5 ; printSmall(arr, n, k); } } |
Python3
# Python 3 for printing smallest # k numbers in order # Function to print smallest k # numbers in arr[0..n-1] def printSmall(arr, n, k): # For each arr[i] find whether # it is a part of n-smallest # with insertion sort concept for i in range (k, n): # find largest from first k-elements max_var = arr[k - 1 ] pos = k - 1 for j in range (k - 2 , - 1 , - 1 ): if (arr[j] > max_var): max_var = arr[j] pos = j # if largest is greater than arr[i] # shift all element one place left if (max_var > arr[i]): j = pos while (j < k - 1 ): arr[j] = arr[j + 1 ] j + = 1 # make arr[k-1] = arr[i] arr[k - 1 ] = arr[i] # print result for i in range ( 0 , k): print (arr[i], end = " " ) # Driver program arr = [ 1 , 5 , 8 , 9 , 6 , 7 , 3 , 4 , 2 , 0 ] n = len (arr) k = 5 printSmall(arr, n, k) |
C#
// C# for printing smallest k numbers in order using System; public class GfG { // Function to print smallest k numbers // in arr[0..n-1] public static void printSmall( int [] arr, int n, int k) { // For each arr[i] find whether // it is a part of n-smallest // with insertion sort concept for ( int i = k; i < n; ++i) { // Find largest from top n-element int max_var = arr[k - 1]; int pos = k - 1; for ( int j = k - 2; j >= 0; j--) { if (arr[j] > max_var) { max_var = arr[j]; pos = j; } } // If largest is greater than arr[i] // shift all element one place left if (max_var > arr[i]) { int j = pos; while (j < k - 1) { arr[j] = arr[j + 1]; j++; } // make arr[k-1] = arr[i] arr[k - 1] = arr[i]; } } // print result for ( int i = 0; i < k; i++) Console.Write(arr[i] + " " ); } // Driver function public static void Main() { int [] arr = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 }; int n = 10; int k = 5; printSmall(arr, n, k); } } |
PHP
<?php // PHP for printing smallest // k numbers in order // Function to print smallest k // numbers in arr[0..n-1] function printSmall( $arr , $n , $k ) { // For each arr[i] find whether // it is a part of n-smallest // with insertion sort concept for ( $i = $k ; $i < $n ; ++ $i ) { // find largest from // first k-elements $max_var = $arr [ $k - 1]; $pos = $k - 1; for ( $j = $k - 2; $j >= 0; $j --) { if ( $arr [ $j ] > $max_var ) { $max_var = $arr [ $j ]; $pos = $j ; } } // if largest is greater than arr[i] // shift all element one place left if ( $max_var > $arr [ $i ]) { $j = $pos ; while ( $j < $k - 1) { $arr [ $j ] = $arr [ $j + 1]; $j ++; } // make arr[k - 1] = arr[i] $arr [ $k - 1] = $arr [ $i ]; } } // print result for ( $i = 0; $i < $k ; $i ++) echo $arr [ $i ] , " " ; } // Driver Code $arr = array (1, 5, 8, 9, 6, 7, 3, 4, 2, 0); $n = count ( $arr ); $k = 5; printSmall( $arr , $n , $k ); ?> |
Javascript
<script> // JavaScript program for printing smallest k numbers in order // Function to print smallest k numbers // in arr[0..n-1] function printSmall(arr, n, k) { // For each arr[i] find whether // it is a part of n-smallest // with insertion sort concept for (let i = k; i < n; ++i) { // Find largest from top n-element let max_var = arr[k - 1]; let pos = k - 1; for (let j = k - 2; j >= 0; j--) { if (arr[j] > max_var) { max_var = arr[j]; pos = j; } } // If largest is greater than arr[i] // shift all element one place left if (max_var > arr[i]) { let j = pos; while (j < k - 1) { arr[j] = arr[j + 1]; j++; } // make arr[k-1] = arr[i] arr[k - 1] = arr[i]; } } // print result for (let i = 0; i < k; i++) document.write(arr[i] + " " ); } // Driver code let arr = [ 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 ]; let n = 10; let k = 5; printSmall(arr, n, k); </script> |
1 3 4 2 0
Time Complexity: O(n2)
Auxiliary Space: O(1)
Please Login to comment...