Sort an Array with a Prefix Already Sorted (original) (raw)

Last Updated : 16 Jun, 2026

Given an array **arr[] of length **n + m, where the first n elements are already sorted, sort the whole array.

**Examples:

**Input: arr[] = [1, 3, 6, 19, 11, 16], m = 3
**Output: [1, 3, 6, 11, 16, 19]
**Explanation: Sorting last 3 elements [19, 11, 16] and merging with first 3 sorted elements [1, 3, 6] gives [1, 3, 6, 11, 16, 19].

**Input: arr[] = [1, 3, 5, 2, 6, 4], m = 3
**Output: [1, 2, 3, 4, 5, 6]
**Explanation: Sorting the last 3 elements [2,6,4] and merging with the first 3 sorted elements [1, 3, 5] gives [1, 2, 3, 4, 5, 6].

Try It Yourselfredirect icon

Table of Content

[Naive Approach] Sorting Entire Array - O((n+m) log(n+m)) Time and O(1) Space

The simplest idea is to ignore the fact that first n elements are already sorted and just sort the entire array using any standard sorting algorithm. This is simple but does not take advantage of the pre-sorted first n elements.

C++ `

#include #include #include using namespace std;

static void sortLastM(vector &arr, int m) {

// Sort the entire array
sort(arr.begin(), arr.end());

}

int main() { vector arr = {1, 3, 6, 19, 11, 16}; int m = 3; sortLastM(arr, m); for (int i = 0; i < (int)arr.size(); i++) { if (i != 0) cout << " "; cout << arr[i]; } cout << endl; return 0; }

Java

import java.util.Arrays;

class GFG {

static void sortLastM(int[] arr, int m) {

    // Sort the entire array
    Arrays.sort(arr);
}

public static void main(String[] args) {
    int[] arr = {1, 3, 6, 19, 11, 16};
    int m = 3;
    sortLastM(arr, m);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        if (i != 0) sb.append(" ");
        sb.append(arr[i]);
    }
    System.out.println(sb);
}

}

Python

def sortLastM(arr, m):

# Sort the entire array
arr.sort()

if name == "main": arr = [1, 3, 6, 19, 11, 16] m = 3 sortLastM(arr, m) print(' '.join(map(str, arr)))

C#

using System;

class GFG {

static void sortLastM(int[] arr, int m) {

    // Sort the entire array
    Array.Sort(arr);
}

static void Main() {
    int[] arr = {1, 3, 6, 19, 11, 16};
    int m = 3;
    sortLastM(arr, m);
    Console.WriteLine(string.Join(" ", arr));
}

}

JavaScript

function sortLastM(arr, m) {

// Sort the entire array
arr.sort((a, b) => a - b);

}

// Driver code let arr = [1, 3, 6, 19, 11, 16]; let m = 3; sortLastM(arr, m); console.log(arr.join(' '));

`

[Expected Approach] Sort Last M and Merge - O(n + m log m) Time and O(m) Space

The idea is to take advantage of the fact that first n elements are already sorted. Sort only the last m elements and then merge them with the first n sorted elements using two pointers from right to left - this avoids any extra O(n) space by filling the result from the end of the array.

C++ `

#include #include #include using namespace std;

static void sortLastM(vector &arr, int m) {

// Calculate n from array size and m
int n = arr.size() - m;

// Sort last m elements and store in temp
vector<int> temp(arr.begin() + n, arr.end());
sort(temp.begin(), temp.end());

// Fill from right using two pointers
int i = n - 1, j = m - 1, k = arr.size() - 1;

while (i >= 0 && j >= 0)
    arr[k--] = arr[i] >= temp[j] ? arr[i--] : temp[j--];

while (j >= 0)
    arr[k--] = temp[j--];

}

int main() { vector arr = {1, 3, 6, 19, 11, 16}; int m = 3; sortLastM(arr, m); for (int i = 0; i < (int)arr.size(); i++) { if (i != 0) cout << " "; cout << arr[i]; } cout << endl; return 0; }

Java

import java.util.Arrays;

class GFG {

static void sortLastM(int[] arr, int m) {

    // Calculate n from array size and m
    int n = arr.length - m;

    // Sort last m elements and store in temp
    int[] temp = Arrays.copyOfRange(arr, n, arr.length);
    Arrays.sort(temp);

    // Fill from right using two pointers
    int i = n - 1, j = m - 1, k = arr.length - 1;

    while (i >= 0 && j >= 0)
        arr[k--] = arr[i] >= temp[j] ? arr[i--] : temp[j--];

    while (j >= 0)
        arr[k--] = temp[j--];
}

public static void main(String[] args) {
    int[] arr = {1, 3, 6, 19, 11, 16};
    int m = 3;
    sortLastM(arr, m);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < arr.length; i++) {
        if (i != 0) sb.append(" ");
        sb.append(arr[i]);
    }
    System.out.println(sb);
}

}

Python

def sortLastM(arr, m):

# Calculate n from array size and m
n = len(arr) - m

# Sort last m elements and store in temp
temp = sorted(arr[n:])

# Fill from right using two pointers
i, j, k = n - 1, m - 1, len(arr) - 1

while i >= 0 and j >= 0:
    if arr[i] >= temp[j]:
        arr[k] = arr[i]
        i -= 1
    else:
        arr[k] = temp[j]
        j -= 1
    k -= 1

while j >= 0:
    arr[k] = temp[j]
    j -= 1
    k -= 1

if name == "main": arr = [1, 3, 6, 19, 11, 16] m = 3 sortLastM(arr, m) print(' '.join(map(str, arr)))

C#

using System;

class GFG {

static void sortLastM(int[] arr, int m) {

    // Calculate n from array size and m
    int n = arr.Length - m;

    // Sort last m elements and store in temp
    int[] temp = new int[m];
    Array.Copy(arr, n, temp, 0, m);
    Array.Sort(temp);

    // Fill from right using two pointers
    int i = n - 1, j = m - 1, k = arr.Length - 1;

    while (i >= 0 && j >= 0)
        arr[k--] = arr[i] >= temp[j] ? arr[i--] : temp[j--];

    while (j >= 0)
        arr[k--] = temp[j--];
}

static void Main() {
    int[] arr = {1, 3, 6, 19, 11, 16};
    int m = 3;
    sortLastM(arr, m);
    Console.WriteLine(string.Join(" ", arr));
}

}

JavaScript

function sortLastM(arr, m) {

// Calculate n from array size and m
let n = arr.length - m;

// Sort last m elements and store in temp
let temp = arr.slice(n).sort((a, b) => a - b);

// Fill from right using two pointers
let i = n - 1, j = m - 1, k = arr.length - 1;

while (i >= 0 && j >= 0)
    arr[k--] = arr[i] >= temp[j] ? arr[i--] : temp[j--];

while (j >= 0)
    arr[k--] = temp[j--];

}

// Driver code let arr = [1, 3, 6, 19, 11, 16]; let m = 3; sortLastM(arr, m); console.log(arr.join(' '));

`