Open In App

Move negatives to the end with relative order preserved using extra space

Last Updated : 23 Jul, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given an unsorted array arr[] of integers. The task is place all negative element at the end of array such that the relative ordering of all negative elements must remain the same before and after placement, and the same should hold true for all positive elements.

Examples: 

Input: arr[] = [1, -1, 3, 2, -7, -5, 11, 6]
Output: [1, 3, 2, 11, 6, -1, -7, -5]
Explanation: All negative elements [-1, -7, -5] were arranged after positive elements [1, 3, 2, 11, 6] and the relative ordering was also preserved.

Input: arr[] = [-5, 7, -3, -4, 9, 10, -1, 11]
Output: [7, 9, 10, 11, -5, -3, -4, -1]
Explanation: All negative elements [-5, -3, -4, -1] were arranged after positive elements [7, 9, 10, 11] and the relative ordering was also preserved.

We have discussed different approaches to this problem in below post.
Rearrange positive and negative numbers with constant extra space

Using Naive Partitioning Algorithm

The idea is to create an auxiliary array (temp[]). First, we traverse the given array and store all the positive elements in the temp[] array. Then, we store all the negative elements from the original array into temp[]. Finally, we copy the contents of temp[] back into the original array, ensuring that the negative elements were placed at the end of the array.

C++
// C++ program to Move All -ve Element At End
// Without changing the relative ordering
// Using Naive Partitioning Algorithm
#include <iostream>
#include <vector>
using namespace std;

// Function to move all -ve element to end of array 
// in same order.
void segregateElements(vector<int>& arr) {
  	int n = arr.size();
  
    // Create an empty array to store result
    vector<int> temp(n);
  	int idx = 0;

    // First fill non-negative elements into the 
  	// temporary array
  	for (int i = 0; i < n; i++) {
      	if (arr[i] >= 0) 
          	temp[idx++] = arr[i];
    }
  	
  	// Now fill negative elements into the 
  	// temporary array
  	for (int i = 0; i < n; i++) {
      	if (arr[i] < 0) 
          	temp[idx++] = arr[i];
    }
  	
  	// copy the elements from temp to arr
  	arr = temp;
}

int main() {
    vector<int> arr = {1 ,-1 ,-3 , -2, 7, 5, 11, 6};
    segregateElements(arr);

    for (int i = 0; i < arr.size(); i++)
    	cout << arr[i] << " ";

    return 0;
}
C
// C program to Move All -ve Element At End
// Without changing the relative ordering
// Using Naive Partitioning Algorithm
#include <stdio.h>
#include <stdlib.h>

void segregateElements(int* arr, int n) {
  
    // Create an empty array to store result
    int* temp = (int*)malloc(n * sizeof(int));
    int idx = 0;

    // First fill non-negative elements into the 
    // temporary array
    for (int i = 0; i < n; i++) {
        if (arr[i] >= 0) 
            temp[idx++] = arr[i];
    }

    // Now fill negative elements into the 
    // temporary array
    for (int i = 0; i < n; i++) {
        if (arr[i] < 0) 
            temp[idx++] = arr[i];
    }

    // copy the elements from temp to arr
    for (int i = 0; i < n; i++) {
        arr[i] = temp[i];
    }
    free(temp);
}

int main() {
    int arr[] = {1, -1, -3, -2, 7, 5, 11, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    segregateElements(arr, n);

    for (int i = 0; i < n; i++) 
        printf("%d ", arr[i]);
    
    return 0;
}
Java
// Java program to Move All -ve Element At End
// Without changing the relative ordering
// Using Naive Partitioning Algorithm
import java.util.Arrays;

class GfG {

    // Function to move all -ve element to end of array 
    // in same order.
    static void segregateElements(int[] arr) {
        int n = arr.length;

        // Create an empty array to store result
        int[] temp = new int[n];
        int idx = 0;

        // First fill non-negative elements into the 
        // temporary array
        for (int i = 0; i < n; i++) {
            if (arr[i] >= 0) 
                temp[idx++] = arr[i];
        }

        // Now fill negative elements into the 
        // temporary array
        for (int i = 0; i < n; i++) {
            if (arr[i] < 0) 
                temp[idx++] = arr[i];
        }

        // copy the elements from temp to arr
        System.arraycopy(temp, 0, arr, 0, n);
    }

    public static void main(String[] args) {
        int[] arr = {1, -1, -3, -2, 7, 5, 11, 6};
        segregateElements(arr);
		
      	for (int ele: arr)
        	System.out.print(ele + " ");
    }
}
Python
# Python program to Move All -ve Element At End
# Without changing the relative ordering
# Using Naive Partitioning Algorithm

def segregateElements(arr):
    n = len(arr)
    
    # Create an empty array to store result
    temp = [0] * n
    idx = 0
    
    # First fill non-negative elements into the 
    # temporary array
    for i in range(n):
        if arr[i] >= 0:
            temp[idx] = arr[i]
            idx += 1
            
    # Now fill negative elements into the 
    # temporary array
    for i in range(n):
        if arr[i] < 0:
            temp[idx] = arr[i]
            idx += 1

    # copy the elements from temp to arr
    for i in range(n):
        arr[i] = temp[i]

if __name__ == "__main__":
    arr = [1, -1, -3, -2, 7, 5, 11, 6]
    segregateElements(arr)
    print(" ".join(map(str, arr)))
C#
// C# program to Move All -ve Element At End
// Without changing the relative ordering
// Using Naive Partitioning Algorithm
using System;

class GfG {

    // Function to move all -ve element to end of array 
    // in same order.
    static void segregateElements(int[] arr) {
        int n = arr.Length;

        // Create an empty array to store result
        int[] temp = new int[n];
        int idx = 0;

        // First fill non-negative elements into the 
        // temporary array
        for (int i = 0; i < n; i++) {
            if (arr[i] >= 0) 
                temp[idx++] = arr[i];
        }

        // Now fill negative elements into the 
        // temporary array
        for (int i = 0; i < n; i++) {
            if (arr[i] < 0) 
                temp[idx++] = arr[i];
        }

        // copy the elements from temp to arr
        Array.Copy(temp, arr, n);
    }

    static void Main() {
        int[] arr = {1, -1, -3, -2, 7, 5, 11, 6};
        segregateElements(arr);

        Console.WriteLine(string.Join(" ", arr));
    }
}
JavaScript
// JavaScript program to Move All -ve Element At End
// Without changing the relative ordering
// Using Naive Partitioning Algorithm

// Function to move all -ve element to end of array 
// in same order.
function segregateElements(arr) {
    let n = arr.length;

    // Create an empty array to store result
    let temp = new Array(n);
    let idx = 0;

    // First fill non-negative elements into the 
    // temporary array
    for (let i = 0; i < n; i++) {
        if (arr[i] >= 0) 
            temp[idx++] = arr[i];
    }

    // Now fill negative elements into the 
    // temporary array
    for (let i = 0; i < n; i++) {
        if (arr[i] < 0) 
            temp[idx++] = arr[i];
    }

    // copy the elements from temp to arr
    for (let i = 0; i < n; i++) {
        arr[i] = temp[i];
    }
}

// Driver Code
let arr = [1, -1, -3, -2, 7, 5, 11, 6];
segregateElements(arr);
console.log(arr.join(" "));

Output
1 7 5 11 6 -1 -3 -2 

Time Complexity : O(n), since the array arr[] got traversed 3 times: first 2 traversal for filling the temporary array and 3rd traversal to copy elements back to original array.
Auxiliary space : O(n), space used by temporary array.

Using Two Stacks

The idea is to use two stacks to rearrange elements while preserving their relative order. The first stack stores negative elements, and the second stores non-negative elements. After processing the entire array, we refill it from the end: first with all negative elements from the negative stack and then with all non-negative elements from the positive stack. This ordering ensures that all negative elements are moved to the end while preserving the original sequence among positive values and among negative values.

C++
// C++ program to Move All -ve Element At End
// Without changing the relative ordering
// Using two Stacks
#include <iostream>
#include <vector>
#include <stack>
using namespace std;

// Function to move all the negative elements 
// to the end of the array in the same order
void segregateElements(vector<int> &arr) {

    // Fill two stacks with positive and negative
    // elements respectively
    stack<int> neg, pos;
    for (int i = 0; i < arr.size(); i++) {
        if (arr[i] < 0)
            neg.push(arr[i]);
        else
            pos.push(arr[i]);
    }

    // Place the elements back to original array arr[]
  	for (int i = arr.size()-1; i >= 0; i--) {
      	
      	// first place the negative elements
      	if (!neg.empty()) {
          	arr[i] = neg.top(); 
          	neg.pop();
        } 
      
      	// If negative elements were all placed
      	// then place remaining elements
      	else {
          	arr[i] = pos.top();
          	pos.pop();
        }
    }
}

int main() {
    vector<int> arr = {1, -1, -3, -2, 7, 5, 11, 6};
    segregateElements(arr);

    for (int ele: arr)
        cout << ele << " ";
    return 0;
}
Java
// Java program to Move All -ve Element At End
// Without changing the relative ordering
// Using two Stacks
import java.util.Stack;

class GfG {

    // Function to move all the negative elements 
    // to the end of the array in the same order
    static void segregateElements(int[] arr) {

        // Fill two stacks with positive and negative
        // elements respectively
        Stack<Integer> neg = new Stack<>();
        Stack<Integer> pos = new Stack<>();
        for (int value : arr) {
            if (value < 0)
                neg.push(value);
            else
                pos.push(value);
        }

        // Place the elements back to original array arr[]
        for (int i = arr.length - 1; i >= 0; i--) {
            
            // first place the negative elements
            if (!neg.isEmpty()) {
                arr[i] = neg.pop();
            } 
            
            // If negative elements were all placed
            // then place remaining elements
            else {
                arr[i] = pos.pop();
            }
        }
    }

    public static void main(String[] args) {
        int[] arr = {1, -1, -3, -2, 7, 5, 11, 6};
        segregateElements(arr);

        for (int ele : arr)
            System.out.print(ele + " ");
    }
}
Python
# Python program to Move All -ve Element At End
# Without changing the relative ordering
# Using two Stacks

# Function to move all the negative elements 
# to the end of the array in the same order
def segregateElements(arr):
    # Fill two stacks with positive and negative
    # elements respectively
    neg = []
    pos = []
    for value in arr:
        if value < 0:
            neg.append(value)
        else:
            pos.append(value)

    # Place the elements back to original array arr
    for i in range(len(arr) - 1, -1, -1):
        
        # first place the negative elements
        if neg:
            arr[i] = neg.pop()
        
        # If negative elements were all placed
        # then place remaining elements
        else:
            arr[i] = pos.pop()

if __name__ == "__main__":
    arr = [1, -1, -3, -2, 7, 5, 11, 6]
    segregateElements(arr)
    print(" ".join(map(str, arr)))
C#
// C# program to Move All -ve Element At End
// Without changing the relative ordering
// Using two Stacks
using System;
using System.Collections.Generic;

class GfG {

    // Function to move all the negative elements 
    // to the end of the array in the same order
    static void segregateElements(int[] arr) {

        // Fill two stacks with positive and negative
        // elements respectively
        Stack<int> neg = new Stack<int>();
        Stack<int> pos = new Stack<int>();
        foreach (int value in arr) {
            if (value < 0)
                neg.Push(value);
            else
                pos.Push(value);
        }

        // Place the elements back to original array arr[]
        for (int i = arr.Length - 1; i >= 0; i--) {
            
            // first place the negative elements
            if (neg.Count > 0) {
                arr[i] = neg.Pop();
            } 
            
            // If negative elements were all placed
            // then place remaining elements
            else {
                arr[i] = pos.Pop();
            }
        }
    }

    static void Main() {
        int[] arr = {1, -1, -3, -2, 7, 5, 11, 6};
        segregateElements(arr);

        foreach (int ele in arr)
            Console.Write(ele + " ");
    }
}
JavaScript
// JavaScript program to Move All -ve Element At End
// Without changing the relative ordering
// Using two Stacks

// Function to move all the negative elements 
// to the end of the array in the same order
function segregateElements(arr) {
    
    // Fill two stacks with positive and negative
    // elements respectively
    let neg = [];
    let pos = [];
    for (let value of arr) {
        if (value < 0)
            neg.push(value);
        else
            pos.push(value);
    }

    // Place the elements back to original array arr[]
    for (let i = arr.length - 1; i >= 0; i--) {
        
        // first place the negative elements
        if (neg.length > 0) {
            arr[i] = neg.pop();
        } 
        
        // If negative elements were all placed
        // then place remaining elements
        else {
            arr[i] = pos.pop();
        }
    }
}

// Driver Code
let arr = [1, -1, -3, -2, 7, 5, 11, 6];
segregateElements(arr);
console.log(arr.join(" "));

Output
1 7 5 11 6 -1 -3 -2 

Time Complexity: O(n), since the array arr[] got traversed twice.
Auxiliary Space: O(n), used by the stacks.

Related Articles: 
Rearrange positive and negative numbers with constant extra space 
Alternate Rearrangement of Positives and Negatives

 


Article Tags :
Practice Tags :

Similar Reads