Open In App

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

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

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>


Output

1 3 4 2 0 

Time Complexity: O(n2)

Auxiliary Space: O(1)



Last Updated : 03 Oct, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads