Create a Sorted Array Using Binary Search - GeeksforGeeks

16 Jun, 2021
Given an array, the task is to create a new sorted array in ascending order from the elements of the given array.Examples:  
Input : arr[] = {2, 5, 4, 9, 8}
Output : 2 4 5 8 9

Input : arr[] = {10, 45, 98, 35, 45}
Output : 10 35 45 45 98
 
The above problem can be solved efficiently using Binary Search. We create a new array and insert the first element if it’s empty. Now for every new element, we find the correct position for the element in the new array using binary search and then insert that element at the corresponding index in the new array.Below is the implementation of the above approach:  
C++
Java
Python3
C#
Javascript
// C++ program to create a sorted array// using Binary Search #include <bits/stdc++.h>using namespace std; // Function to create a new sorted array// using Binary Searchvoid createSorted(int a[], int n){    // Auxiliary Array    vector<int> b;     for (int j = 0; j < n; j++) {        // if b is empty any element can be at        // first place        if (b.empty())            b.push_back(a[j]);        else {             // Perform Binary Search to find the correct            // position of current element in the            // new array            int start = 0, end = b.size() - 1;             // let the element should be at first index            int pos = 0;             while (start <= end) {                 int mid = start + (end - start) / 2;                 // if a[j] is already present in the new array                if (b[mid] == a[j]) {                    // add a[j] at mid+1. you can add it at mid                    b.emplace(b.begin() + max(0, mid + 1), a[j]);                    break;                }                // if a[j] is lesser than b[mid] go right side                else if (b[mid] > a[j])                    // means pos should be between start and mid-1                    pos = end = mid - 1;                else                    // else pos should be between mid+1 and end                    pos = start = mid + 1;                 // if a[j] is the largest push it at last                if (start > end) {                    pos = start;                    b.emplace(b.begin() + max(0, pos), a[j]);                     // here max(0, pos) is used because sometimes                    // pos can be negative as smallest duplicates                    // can be present in the array                    break;                }            }        }    }     // Print the new generated sorted array    for (int i = 0; i < n; i++)        cout << b[i] << " ";} // Driver Codeint main(){    int a[] = { 2, 5, 4, 9, 8 };    int n = sizeof(a) / sizeof(a[0]);     createSorted(a, n);     return 0;}
// Java program to create a sorted array// using Binary Searchimport java.util.*; class GFG{ // Function to create a new sorted array// using Binary Searchstatic void createSorted(int a[], int n){    // Auxiliary Array    Vector<Integer> b = new Vector<>();     for (int j = 0; j < n; j++)    {        // if b is empty any element can be at        // first place        if (b.isEmpty())            b.add(a[j]);        else        {             // Perform Binary Search to find the correct            // position of current element in the            // new array            int start = 0, end = b.size() - 1;             // let the element should be at first index            int pos = 0;             while (start <= end)            {                 int mid = start + (end - start) / 2;                 // if a[j] is already present in the new array                if (b.get(mid) == a[j])                {                    // add a[j] at mid+1. you can add it at mid                    b.add((Math.max(0, mid + 1)), a[j]);                    break;                }                                 // if a[j] is lesser than b[mid] go right side                else if (b.get(mid) > a[j])                    // means pos should be between start and mid-1                    pos = end = mid - 1;                else                    // else pos should be between mid+1 and end                    pos = start = mid + 1;                 // if a[j] is the largest push it at last                if (start > end)                {                    pos = start;                    b.add(Math.max(0, pos), a[j]);                     // here max(0, pos) is used because sometimes                    // pos can be negative as smallest duplicates                    // can be present in the array                    break;                }            }        }    }     // Print the new generated sorted array    for (int i = 0; i < n; i++)        System.out.print(b.get(i) + " ");} // Driver Codepublic static void main(String args[]){    int a[] = { 2, 5, 4, 9, 8 };    int n = a.length;     createSorted(a, n);}} /* This code is contributed by PrinciRaj1992 */
# Python program to create a sorted array# using Binary Search # Function to create a new sorted array# using Binary Searchdef createSorted(a: list, n: int):     # Auxiliary Array    b = []    for j in range(n):         # if b is empty any element can be at        # first place        if len(b) == 0:            b.append(a[j])        else:             # Perform Binary Search to find the correct            # position of current element in the            # new array            start = 0            end = len(b) - 1             # let the element should be at first index            pos = 0            while start <= end:                mid = start + (end - start) // 2                 # if a[j] is already present in the new array                if b[mid] == a[j]:                     # add a[j] at mid+1. you can add it at mid                    b.insert(max(0, mid + 1), a[j])                    break                 # if a[j] is lesser than b[mid] go right side                elif b[mid] > a[j]:                     # means pos should be between start and mid-1                    pos = end = mid - 1                else:                     # else pos should be between mid+1 and end                    pos = start = mid + 1                 # if a[j] is the largest push it at last                if start > end:                    pos = start                    b.insert(max(0, pos), a[j])                     # here max(0, pos) is used because sometimes                    # pos can be negative as smallest duplicates                    # can be present in the array                    break     # Print the new generated sorted array    for i in range(n):        print(b[i], end=" ") # Driver Codeif __name__ == "__main__":     a = [2, 5, 4, 9, 8]    n = len(a)    createSorted(a, n) # This code is contributed by# sanjeev2552
// C# program to create a sorted array// using Binary Searchusing System;using System.Collections.Generic;     class GFG{ // Function to create a new sorted array// using Binary Searchstatic void createSorted(int []a, int n){    // Auxiliary Array    List<int> b = new List<int>();     for (int j = 0; j < n; j++)    {        // if b is empty any element can be at        // first place        if (b.Count == 0)            b.Add(a[j]);        else        {             // Perform Binary Search to find the correct            // position of current element in the            // new array            int start = 0, end = b.Count - 1;             // let the element should be at first index            int pos = 0;             while (start <= end)            {                 int mid = start + (end - start) / 2;                 // if a[j] is already present in the new array                if (b[mid] == a[j])                {                    // add a[j] at mid+1. you can add it at mid                    b.Insert((Math.Max(0, mid + 1)), a[j]);                    break;                }                                 // if a[j] is lesser than b[mid] go right side                else if (b[mid] > a[j])                                     // means pos should be between start and mid-1                    pos = end = mid - 1;                else                                     // else pos should be between mid+1 and end                    pos = start = mid + 1;                 // if a[j] is the largest push it at last                if (start > end)                {                    pos = start;                    b.Insert(Math.Max(0, pos), a[j]);                     // here Max(0, pos) is used because sometimes                    // pos can be negative as smallest duplicates                    // can be present in the array                    break;                }            }        }    }     // Print the new generated sorted array    for (int i = 0; i < n; i++)        Console.Write(b[i] + " ");} // Driver Codepublic static void Main(String []args){    int []a = { 2, 5, 4, 9, 8 };    int n = a.Length;     createSorted(a, n);}} // This code is contributed by 29AjayKumar
<script>       // JavaScript program to create a sorted array      // using Binary Search             // Function to create a new sorted array      // using Binary Search      function createSorted(a, n) {        // Auxiliary Array        var b = [];         for (var j = 0; j < n; j++) {          // if b is empty any element can be at          // first place          if (b.length == 0) b.push(a[j]);          else {            // Perform Binary Search to find the correct            // position of current element in the            // new array            var start = 0,              end = b.length - 1;             // let the element should be at first index            var pos = 0;             while (start <= end) {              var mid = start + parseInt((end - start) / 2);               // if a[j] is already present in the new array              if (b[mid] === a[j]) {                // add a[j] at mid+1. you can add it at mid                b.insert(Math.max(0, mid + 1), a[j]);                 break;              }               // if a[j] is lesser than b[mid] go right side              else if (b[mid] > a[j])                // means pos should be between start and mid-1                pos = end = mid - 1;              // else pos should be between mid+1 and end              else pos = start = mid + 1;               // if a[j] is the largest push it at last              if (start > end) {                pos = start;                b.insert(Math.max(0, pos), a[j]);                 // here Max(0, pos) is used because sometimes                // pos can be negative as smallest duplicates                // can be present in the array                break;              }            }          }        }         // Print the new generated sorted array        for (var i = 0; i < n; i++) document.write(b[i] + " ");      }       Array.prototype.insert = function (index, item) {        this.splice(index, 0, item);      };      // Driver Code      var a = [2, 5, 4, 9, 8];      var n = a.length;       createSorted(a, n);       </script>
2 4 5 8 9
 
Time Complexity: O(N*N). Although binary search is being used, the list insert calls run in O(N) time on averageAuxiliary Space: O(N) 
princiraj1992
29AjayKumar
sanjeev2552
nidhi_biet
gqfgtks44jbg1patgpz4bnxsxjvtaml4foqqto9c
rdtank
Binary Search
Arrays
Greedy
Searching
Sorting
Arrays
Searching
Greedy
Sorting
Binary Search
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Chocolate Distribution Problem
Window Sliding Technique
Reversal algorithm for array rotation
Next Greater Element
Find duplicates in O(n) time and O(1) extra space | Set 1
Dijkstra's shortest path algorithm | Greedy Algo-7
Kruskal’s Minimum Spanning Tree Algorithm | Greedy Algo-2
Prim’s Minimum Spanning Tree (MST) | Greedy Algo-5
Write a program to print all permutations of a given string
Huffman Coding | Greedy Algo-3