k smallest elements in same order using O(1) extra space - GeeksforGeeks

14 Apr, 2021
You 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 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 efficient solution to find n smallest elements of above problem with using extra space of O(n). To solve it without using any extra space we will use concept of insertion sort.The idea is to move k minimum elements to beginning in same order. To do this, we start from (k+1)-th element and move till end. For every array element, we replace the largest element of first k elements with the current element if current element is smaller than the largest. To keep the order, we use insertion sort idea.  
C++
Java
Python3
C#
PHP
Javascript
// 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 programint 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 for printing smallest k numbers in orderimport java.util.*;import java.lang.*; 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);    } }/* This code is contributed by Sagar Shukla */
# 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 programarr = [1, 5, 8, 9, 6, 7, 3, 4, 2, 0]n = len(arr)k = 5printSmall(arr, n, k)     # This code is contributed by# Smitha Dinesh Semwal
// C# for printing smallest k numbers in orderusing 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);    }} /* This code is contributed by Vt_m */
<?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);     // This code is contributed by Vt_m?>
<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);         // This code is contributed by sanjoy_62.</script>
Output :  
1 3 4 2 0
 
vt_m
sanjoy_62
Order-Statistics
Arrays
Sorting
Arrays
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Arrays in Java
Arrays in C/C++
Program for array rotation
Stack Data Structure (Introduction and Program)
Top 50 Array Coding Problems for Interviews