Sort a stream of integers - GeeksforGeeks

08 Mar, 2021
Given an array, arr[] of size N whose elements from left to right, must be read as an incoming stream of integers, the task is to sort the stream of integers and print accordingly.
Examples:
Input: arr[] = {2, 4, 1, 7, 3}Output: 1 2 3 4 7Explanation: First element in the stream: 2 → Sorted list: {2}Second element in the stream: 4 → Sorted list: {2, 4}Third element in the stream: 1 → Sorted list: {1, 2, 4}Fourth element in the stream: 7 → Sorted list: {1, 2, 4, 7}Fifth element in the stream: 3 → Sorted list: {1, 2, 3, 4, 7}
Input: arr[] = {4, 1, 7, 6, 2}Output: 1 2 4 6 7Explanation:First element in the stream: 4 → Sorted list: {4}Second element in the stream: 1 → Sorted list: {1, 4}Third element in the stream: 7 → Sorted list: {1, 4, 7}Fourth element in the stream: 6 → Sorted list: {1, 4, 6, 7}Fifth element in the stream: 2 → Sorted list: {1, 2, 4, 6, 7}
Naive Approach: The simplest approach is to <a href=”https://www.geeksforgeeks.org/c-program-to-traverse-an-array/”>traverse the array and for each array element, linearly scan the array and find the right position of that element and place it in the array.
Below is the implementation of the above approach:
C++
Java
Python3
C#
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to sort a stream of integersvoid Sort(vector<int>& ans, int num){    // Stores the position of    // array elements    int pos = -1;     // Traverse through the array    for (int i = 0; i < ans.size(); i++) {         // If any element is found to be        // greater than the current element        if (ans[i] >= num) {            pos = i;            break;        }    }     // If an element > num is not present    if (pos == -1)        ans.push_back(num);     // Otherwise, place the number    // at its right position    else        ans.insert(ans.begin() + pos, num);} // Function to print the sorted stream of integersvoid sortStream(int arr[], int N){    // Stores the sorted stream of integers    vector<int> ans;     // Traverse the array    for (int i = 0; i < N; i++) {         // Function Call        Sort(ans, arr[i]);         // Print the array after        // every insertion        for (int i = 0; i < ans.size(); i++) {            cout << ans[i] << " ";        }        cout << endl;    }} // Driver Codeint main(){    int arr[] = { 4, 1, 7, 6, 2 };    int N = sizeof(arr) / sizeof(arr[0]);     sortStream(arr, N);     return 0;}
// Java program for the above approachimport java.util.*; class GFG{ // Function to sort a stream of integersstatic void Sort(Vector<Integer> ans, int num){         // Stores the position of    // array elements    int pos = -1;     // Traverse through the array    for(int i = 0; i < ans.size(); i++)    {                 // If any element is found to be        // greater than the current element        if (ans.get(i) >= num)        {            pos = i;            break;        }    }     // If an element > num is not present    if (pos == -1)        ans.add(num);     // Otherwise, place the number    // at its right position    else        ans.add(pos, num);} // Function to print the sorted stream of integersstatic void sortStream(int arr[], int N){         // Stores the sorted stream of integers    Vector<Integer> ans = new Vector<Integer>();     // Traverse the array    for(int i = 0; i < N; i++)    {                 // Function Call        Sort(ans, arr[i]);         // Print the array after        // every insertion        for(int j = 0; j < ans.size(); j++)        {            System.out.print(ans.get(j) + " ");        }        System.out.println();    }} // Driver Codepublic static void main(String[] args){    int arr[] = { 4, 1, 7, 6, 2 };    int N = arr.length;     sortStream(arr, N);}} // This code is contributed by Amit Katiyar
# Python program for the above approach # Function to sort a stream of integersdef Sort(ans, num):       # Stores the position of    # array elements    pos = -1;     # Traverse through the array    for  i in range(len(ans)):         # If any element is found to be        # greater than the current element        if (ans[i] >= num):            pos = i;            break;     # If an element > num is not present    if (pos == -1):        ans.append(num);     # Otherwise, place the number    # at its right position    else:        ans.insert(pos,num);    return ans; # Function to print the sorted stream of integersdef sortStream(arr, N):       # Stores the sorted stream of integers    ans = list();     # Traverse the array    for i in range(N):         # Function Call        ans = Sort(ans, arr[i]);         # Print the array after        # every insertion        for j in range(len(ans)):            print(ans[j], end = " ");         print(); # Driver Codeif __name__ == '__main__':    arr = [4, 1, 7, 6, 2];    N = len(arr);     sortStream(arr, N); # This code is contributed by 29AjayKumar
// C# program for the above approachusing System;using System.Collections.Generic;class GFG{ // Function to sort a stream of integersstatic void Sort(List<int> ans, int num){         // Stores the position of    // array elements    int pos = -1;     // Traverse through the array    for(int i = 0; i < ans.Count; i++)    {                 // If any element is found to be        // greater than the current element        if (ans[i] >= num)        {            pos = i;            break;        }    }     // If an element > num is not present    if (pos == -1)        ans.Add(num);     // Otherwise, place the number    // at its right position    else        ans.Insert(pos, num);} // Function to print the sorted stream of integersstatic void sortStream(int []arr, int N){         // Stores the sorted stream of integers    List<int> ans = new List<int>();     // Traverse the array    for(int i = 0; i < N; i++)    {                 // Function Call        Sort(ans, arr[i]);         // Print the array after        // every insertion        for(int j = 0; j < ans.Count; j++)        {            Console.Write(ans[j] + " ");        }        Console.WriteLine();    }} // Driver Codepublic static void Main(String[] args){    int []arr = { 4, 1, 7, 6, 2 };    int N = arr.Length;    sortStream(arr, N);}} // This code is contributed by 29AjayKumar
4 
1 4 
1 4 7 
1 4 6 7 
1 2 4 6 7
 
Time Complexity: O(N2)Auxiliary Space: O(N)
Efficient Approach: To optimize the above approach, the idea is to use a Binary Search to find the correct position of each element in the sorted list. Follow the steps below to solve the problem:
Initialize an array ans[] to store the final sorted stream of numbers.
Traverse the array arr[] as a stream of numbers using a variable i and perform the following steps:If array ans is empty, push arr[i] to ans.Otherwise, find the correct position of arr[i] in the already sorted array ans[] using lower_bound() and push arr[i] at its correct position.
If array ans is empty, push arr[i] to ans.
Otherwise, find the correct position of arr[i] in the already sorted array ans[] using lower_bound() and push arr[i] at its correct position.
After completing the above steps, print the array ans[].
Below is the implementation of the above approach:
C++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std; // Function to sort a stream of integersvoid Sort(vector<int>& ans, int num){    // If the element is greater than    // all the elements in the sorted    // array, then it push at the back    if (lower_bound(ans.begin(),                    ans.end(), num)        == ans.end()) {        ans.push_back(num);    }     // Otherwise, find its correct position    else {        int pos = lower_bound(ans.begin(),                              ans.end(),                              num)                  - ans.begin();         // Insert the element        ans.insert(ans.begin() + pos,                   num);    }} // Function to print the sorted stream of integersvoid sortStream(int arr[], int N){    // Stores the sorted stream of integers    vector<int> ans;     // Traverse the array    for (int i = 0; i < N; i++) {         // Function Call        Sort(ans, arr[i]);         // Print the array after        // every insertion        for (int i = 0; i < ans.size(); i++) {            cout << ans[i] << " ";        }        cout << endl;    }} // Driver Codeint main(){    int arr[] = { 4, 1, 7, 6, 2 };    int N = sizeof(arr) / sizeof(arr[0]);     sortStream(arr, N);     return 0;}
4 
1 4 
1 4 7 
1 4 6 7 
1 2 4 6 7
 
Time Complexity: O(N*log N)Auxiliary Space: O(N)
amit143katiyar
29AjayKumar
nidhi_biet
array-stream
Binary Search
Arrays
Searching
Sorting
Arrays
Searching
Sorting
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Next Greater Element
Window Sliding Technique
Count pairs with given sum
Program to find sum of elements in a given array
Reversal algorithm for array rotation
Binary Search
Median of two sorted arrays of different sizes
Most frequent element in an array
Find the index of an array element in Java
Count number of occurrences (or frequency) in a sorted array