# Sort an array when two halves are sorted

• Difficulty Level : Easy
• Last Updated : 06 Jul, 2022

Given an integer array of which both first half and second half are sorted. Task is to merge two sorted halves of array into single sorted array.

Examples:

```Input : A[] = { 2, 3, 8, -1, 7, 10 }
Output : -1, 2, 3, 7, 8, 10

Input : A[] = {-4, 6, 9, -1, 3 }
Output : -4, -1, 3, 6, 9```
Recommended Practice

Method 1: A Simple Solution is to sort the array using built in functions (generally an implementation of quick sort).

Below is the implementation of above method:

## C++

 `// C++ program to Merge two sorted halves of` `// array Into Single Sorted Array` `#include ` `using` `namespace` `std;`   `void` `mergeTwoHalf(``int` `A[], ``int` `n)` `{` `    ``// Sort the given array using sort STL` `    ``sort(A, A + n);` `}`   `// Driver code` `int` `main()` `{` `    ``int` `A[] = { 2, 3, 8, -1, 7, 10 };` `    ``int` `n = ``sizeof``(A) / ``sizeof``(A[0]);` `    ``mergeTwoHalf(A, n);`   `    ``// Print sorted Array` `    ``for` `(``int` `i = 0; i < n; i++)` `        ``cout << A[i] << ``" "``;` `    ``return` `0;` `}`

## Java

 `// Java program to Merge two sorted halves of` `// array Into Single Sorted Array` `import` `java.io.*;` `import` `java.util.*;`   `class` `GFG {`   `    ``static` `void` `mergeTwoHalf(``int``[] A, ``int` `n)` `    ``{` `        ``// Sort the given array using sort STL` `        ``Arrays.sort(A);` `    ``}`   `    ``// Driver code` `    ``static` `public` `void` `main(String[] args)` `    ``{` `        ``int``[] A = { ``2``, ``3``, ``8``, -``1``, ``7``, ``10` `};` `        ``int` `n = A.length;` `        ``mergeTwoHalf(A, n);`   `        ``// Print sorted Array` `        ``for` `(``int` `i = ``0``; i < n; i++)` `            ``System.out.print(A[i] + ``" "``);` `    ``}` `}`   `// This code is contributed by vt_m .`

## Python3

 `# Python program to Merge two sorted` `# halves of array Into Single Sorted Array`     `def` `mergeTwoHalf(A, n):`   `    ``# Sort the given array using sort STL` `    ``A.sort()`     `# Driver Code` `if` `__name__ ``=``=` `'__main__'``:` `    ``A ``=` `[``2``, ``3``, ``8``, ``-``1``, ``7``, ``10``]` `    ``n ``=` `len``(A)` `    ``mergeTwoHalf(A, n)`   `    ``# Print sorted Array` `    ``for` `i ``in` `range``(n):` `        ``print``(A[i], end``=``" "``)`   `# This code is contributed by 29AjayKumar`

## C#

 `// C# program to Merge two sorted halves of` `// array Into Single Sorted Array` `using` `System;`   `class` `GFG {`   `    ``static` `void` `mergeTwoHalf(``int``[] A, ``int` `n)` `    ``{` `        ``// Sort the given array using sort STL` `        ``Array.Sort(A);` `    ``}`   `    ``// Driver code` `    ``static` `public` `void` `Main()` `    ``{` `        ``int``[] A = { 2, 3, 8, -1, 7, 10 };` `        ``int` `n = A.Length;` `        ``mergeTwoHalf(A, n);`   `        ``// Print sorted Array` `        ``for` `(``int` `i = 0; i < n; i++)` `            ``Console.Write(A[i] + ``" "``);` `    ``}` `}`   `// This code is contributed by vt_m .`

## PHP

 ``

## Javascript

 ``

Output

`-1 2 3 7 8 10 `

Time Complexity:

```*** QuickLaTeX cannot compile formula:

*** Error message:
Error: Nothing to show, formula is empty
```

best & average case, worst case (for quicksort)
Space Complexity:

```*** QuickLaTeX cannot compile formula:

*** Error message:
Error: Nothing to show, formula is empty
```

to

```*** QuickLaTeX cannot compile formula:

*** Error message:
Error: Nothing to show, formula is empty
```

depending on the case & implementation (for quicksort)

For more details, check out the GFG article on Quicksort.

Method 2: A more efficient solution is to use an auxiliary array which is very similar to the Merge Function of Merge sort

Below is the implementation of above approach :

## C++

 `// C++ program to Merge Two Sorted Halves Of` `// Array Into Single Sorted Array` `#include ` `using` `namespace` `std;`   `// Merge two sorted halves of Array into single` `// sorted array` `void` `mergeTwoHalf(``int` `A[], ``int` `n)` `{` `    ``int` `half_i = 0; ``// starting index of second half`   `    ``// Temp Array store sorted resultant array` `    ``int` `temp[n];`   `    ``// First Find the point where array is divide` `    ``// into two half` `    ``for` `(``int` `i = 0; i < n - 1; i++) {` `        ``if` `(A[i] > A[i + 1]) {` `            ``half_i = i + 1;` `            ``break``;` `        ``}` `    ``}`   `    ``// If Given array is all-ready sorted` `    ``if` `(half_i == 0)` `        ``return``;`   `    ``// Merge two sorted arrays in single sorted array` `    ``int` `i = 0, j = half_i, k = 0;` `    ``while` `(i < half_i && j < n) {` `        ``if` `(A[i] < A[j])` `            ``temp[k++] = A[i++];` `        ``else` `            ``temp[k++] = A[j++];` `    ``}`   `    ``// Copy the remaining elements of A[i to half_! ]` `    ``while` `(i < half_i)` `        ``temp[k++] = A[i++];`   `    ``// Copy the remaining elements of A[ half_! to n ]` `    ``while` `(j < n)` `        ``temp[k++] = A[j++];`   `    ``for` `(``int` `i = 0; i < n; i++)` `        ``A[i] = temp[i];` `}`   `// Driver code` `int` `main()` `{` `    ``int` `A[] = { 2, 3, 8, -1, 7, 10 };` `    ``int` `n = ``sizeof``(A) / ``sizeof``(A[0]);` `    ``mergeTwoHalf(A, n);`   `    ``// Print sorted Array` `    ``for` `(``int` `i = 0; i < n; i++)` `        ``cout << A[i] << ``" "``;` `    ``return` `0;` `}`

## Java

 `// Java program to Merge Two Sorted Halves Of` `// Array Into Single Sorted Array` `import` `java.io.*;`   `class` `GFG {`   `    ``// Merge two sorted halves of Array` `    ``// into single sorted array` `    ``static` `void` `mergeTwoHalf(``int``[] A, ``int` `n)` `    ``{` `        ``int` `half_i = ``0``; ``// starting index of second half` `        ``int` `i;`   `        ``// Temp Array store sorted resultant array` `        ``int``[] temp = ``new` `int``[n];`   `        ``// First Find the point where array is divide` `        ``// into two half` `        ``for` `(i = ``0``; i < n - ``1``; i++) {` `            ``if` `(A[i] > A[i + ``1``]) {` `                ``half_i = i + ``1``;` `                ``break``;` `            ``}` `        ``}`   `        ``// If Given array is all-ready sorted` `        ``if` `(half_i == ``0``)` `            ``return``;`   `        ``// Merge two sorted arrays in single sorted array` `        ``i = ``0``;` `        ``int` `j = half_i;` `        ``int` `k = ``0``;` `        ``while` `(i < half_i && j < n) {` `            ``if` `(A[i] < A[j])` `                ``temp[k++] = A[i++];` `            ``else` `                ``temp[k++] = A[j++];` `        ``}`   `        ``// Copy the remaining elements of A[i to half_! ]` `        ``while` `(i < half_i)` `            ``temp[k++] = A[i++];`   `        ``// Copy the remaining elements of A[ half_! to n ]` `        ``while` `(j < n)` `            ``temp[k++] = A[j++];`   `        ``for` `(i = ``0``; i < n; i++)` `            ``A[i] = temp[i];` `    ``}`   `    ``// Driver code` `    ``static` `public` `void` `main(String[] args)` `    ``{` `        ``int``[] A = { ``2``, ``3``, ``8``, -``1``, ``7``, ``10` `};` `        ``int` `n = A.length;` `        ``mergeTwoHalf(A, n);`   `        ``// Print sorted Array` `        ``for` `(``int` `i = ``0``; i < n; i++)` `            ``System.out.print(A[i] + ``" "``);` `    ``}` `}`   `// This code is contributed by vt_m .`

## Python3

 `# Python3 program to Merge Two Sorted Halves Of` `# Array Into Single Sorted Array`   `# Merge two sorted halves of Array into single` `# sorted array` `def` `mergeTwoHalf(A, n):` `    `  `    ``# Starting index of second half` `    ``half_i ``=` `0`      `    ``# Temp Array store sorted resultant array` `    ``temp ``=` `[``0` `for` `i ``in` `range``(n)]`   `    ``# First Find the point where array is ` `    ``# divide into two half` `    ``for` `i ``in` `range``(n ``-` `1``):` `        ``if` `(A[i] > A[i ``+` `1``]):` `            ``half_i ``=` `i ``+` `1` `            ``break`   `    ``# If Given array is all-ready sorted` `    ``if` `(half_i ``=``=` `0``):` `        ``return`   `    ``# Merge two sorted arrays in single` `    ``# sorted array` `    ``i ``=` `0` `    ``j ``=` `half_i` `    ``k ``=` `0` `    `  `    ``while` `(i < half_i ``and` `j < n):` `        ``if` `(A[i] < A[j]):` `            ``temp[k] ``=` `A[i]` `            ``k ``+``=` `1` `            ``i ``+``=` `1` `        ``else``:` `            ``temp[k] ``=` `A[j]` `            ``k ``+``=` `1` `            ``j ``+``=` `1` `    `  `    ``# Copy the remaining elements of A[i to half_! ]` `    ``while` `i < half_i:` `        ``temp[k] ``=` `A[i]` `        ``k ``+``=` `1` `        ``i ``+``=` `1`   `    ``# Copy the remaining elements of A[ half_! to n ]` `    ``while` `(j < n):` `        ``temp[k] ``=` `A[j]` `        ``k ``+``=` `1` `        ``j ``+``=` `1`   `    ``for` `i ``in` `range``(n):` `        ``A[i] ``=` `temp[i]`   `# Driver code` `A ``=` `[ ``2``, ``3``, ``8``, ``-``1``, ``7``, ``10` `]` `n ``=` `len``(A)`   `mergeTwoHalf(A, n)`   `# Print sorted Array` `print``(``*``A, sep ``=` `' '``)`   `# This code is contributed by avanitrachhadiya2155`

## C#

 `// C# program to Merge Two Sorted Halves Of` `// Array Into Single Sorted Array` `using` `System`   `    ``class` `GFG {`   `    ``// Merge two sorted halves of Array` `    ``// into single sorted array` `    ``static` `void` `mergeTwoHalf(``int``[] A, ``int` `n)` `    ``{` `        ``int` `half_i = 0` `            ``// starting index of second half` `            ``int` `i`   `            ``// Temp Array store sorted resultant array` `            ``int``[] temp` `            ``= ``new` `int``[n]`   `            ``// First Find the point where array is divide` `            ``// into two half` `            ``for` `(i = 0 i < n - 1 i++)` `        ``{` `            ``if` `(A[i] > A[i + 1]) {` `                ``half_i = i + 1 ``break` `            ``}` `        ``}`   `        ``// If Given array is all-ready sorted` `        ``if` `(half_i == 0)` `            ``return`   `                ``// Merge two sorted arrays in single sorted` `                ``// array` `                ``i = 0 ``int` `j = half_i ``int` `k` `                ``= 0 ``while` `(i < half_i & &j < n)` `            ``{` `                ``if` `(A[i] < A[j])` `                    ``temp[k++] = A[i++] ``else` `temp[k++]` `                        ``= A[j++]` `            ``}`   `        ``// Copy the remaining elements of A[i to half_!]` `        ``while` `(i < half_i)` `            ``temp[k++] = A[i++]`   `                ``// Copy the remaining elements of A[half_!` `                ``// to n]` `                ``while` `(j < n) temp[k++]` `                ``= A[j++]`   `                ``for` `(i = 0 i < n i++) A[i]` `                ``= temp[i]` `    ``}`   `    ``// Driver code` `    ``static` `public` `void` `Main()` `    ``{` `        ``int``[] A` `            ``= { 2,` `                ``3,` `                ``8,` `                ``-1,` `                ``7,` `                ``10 } ``int` `n` `            ``= A.Length mergeTwoHalf(A, n)`   `              ``// Print sorted Array` `              ``for` `(``int` `i = 0 i < n i++)` `                  ``Console.Write(A[i] + ``" "``)` `    ``}` `}`   `// This code is contributed by vt_m .`

## Javascript

 ``

Output

`-1 2 3 7 8 10 `

Time Complexity:

```*** QuickLaTeX cannot compile formula:

*** Error message:
Error: Nothing to show, formula is empty
```

Space Complexity:

```*** QuickLaTeX cannot compile formula:

*** Error message:
Error: Nothing to show, formula is empty
```

If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

My Personal Notes arrow_drop_up
Related Articles