Given an unsorted array arr[] of both negative and positive integer. The task is place all negative element at the end of array without changing the order of positive element and negative element.
Examples:
Input : arr[] = {1, -1, 3, 2, -7, -5, 11, 6 }
Output : 1 3 2 11 6 -1 -7 -5
Input : arr[] = {-5, 7, -3, -4, 9, 10, -1, 11}
Output : 7 9 10 11 -5 -3 -4 -1
We have discussed different approaches to this problem in below post.
Rearrange positive and negative numbers with constant extra space
The problem becomes easier if we are allowed to use extra space. Idea is create an empty array (temp[]). First we store all positive element of given array and then we store all negative element of array in Temp[]. Finally we copy temp[] to original array.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
void segregateElements( int arr[], int n)
{
int temp[n];
int j = 0;
for ( int i = 0; i < n ; i++)
if (arr[i] >= 0 )
temp[j++] = arr[i];
if (j == n || j == 0)
return ;
for ( int i = 0 ; i < n ; i++)
if (arr[i] < 0)
temp[j++] = arr[i];
memcpy (arr, temp, sizeof (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++)
cout << arr[i] << " " ;
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
static void segregateElements( int arr[], int n)
{
int temp[] = new int [n];
int j = 0 ;
for ( int i = 0 ; i < n; i++)
if (arr[i] >= 0 )
temp[j++] = arr[i];
if (j == n || j == 0 )
return ;
for ( int i = 0 ; i < n; i++)
if (arr[i] < 0 )
temp[j++] = arr[i];
for ( int i = 0 ; i < n; i++)
arr[i] = temp[i];
}
public static void main(String arg[])
{
int arr[] = { 1 , - 1 , - 3 , - 2 , 7 , 5 , 11 , 6 };
int n = arr.length;
segregateElements(arr, n);
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
}
|
Python3
def move(arr,n):
j = 0
ans = [ None ] * n
i = 0 ;j = n - 1
for k in range (n):
if arr[k]> = 0 :
ans[i] = arr[k]
i + = 1
else :
ans[j] = arr[k]
j - = 1
ans[i:] = ans[n - 1 :i - 1 : - 1 ]
return ans
arr = [ 1 , - 1 , - 3 , - 2 , 7 , 5 , 11 , 6 ]
n = len (arr)
print (move(arr, n))
|
C#
using System;
class GFG {
static void segregateElements( int [] arr, int n)
{
int [] temp = new int [n];
int j = 0;
for ( int i = 0; i < n; i++)
if (arr[i] >= 0)
temp[j++] = arr[i];
if (j == n || j == 0)
return ;
for ( int i = 0; i < n; i++)
if (arr[i] < 0)
temp[j++] = arr[i];
for ( int i = 0; i < n; i++)
arr[i] = temp[i];
}
public static void Main()
{
int [] arr = { 1, -1, -3, -2, 7, 5, 11, 6 };
int n = arr.Length;
segregateElements(arr, n);
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
}
|
Javascript
<script>
function segregateElements(arr, n)
{
let temp= new Array(n);
let j = 0;
for (let i = 0; i < n ; i++)
if (arr[i] >= 0 )
temp[j++] = arr[i];
if (j == n || j == 0)
return ;
for (let i = 0 ; i < n ; i++)
if (arr[i] < 0)
temp[j++] = arr[i];
for (let i = 0; i < n ; i++) arr[i] = temp[i];
}
let arr= [1 ,-1 ,-3 , -2, 7, 5, 11, 6];
let n = arr.length;
segregateElements(arr, n);
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
</script>
|
PHP
<?php
function segregateElements(& $arr , $n )
{
$temp = array (0, $n , NULL);
$j = 0;
for ( $i = 0; $i < $n ; $i ++)
if ( $arr [ $i ] >= 0 )
$temp [ $j ++] = $arr [ $i ];
if ( $j == $n || $j == 0)
return ;
for ( $i = 0 ; $i < $n ; $i ++)
if ( $arr [ $i ] < 0)
$temp [ $j ++] = $arr [ $i ];
for ( $i = 0; $i < $n ; $i ++)
$arr [ $i ] = $temp [ $i ];
}
$arr = array (1 ,-1 ,-3 , -2, 7, 5, 11, 6 );
$n = sizeof( $arr );
segregateElements( $arr , $n );
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
?>
|
Output
1 7 5 11 6 -1 -3 -2
Time Complexity : O(n)
Auxiliary space : O(n), since n extra space has been taken.
Another Approach: Using Stack
- Declare two stacks (pos, neg) which stores the positive and negative values of arr[i] respectively.
- Iterate over the arr from index 0 to n-1.
- If arr[i]<0, push the element in the neg stack.
- Else push the element in the pos stack.
- After traversing the array, use while loop until the neg stack becomes empty.
- Starting from the last of the index of the arr, store the top of the neg stack in arr and pop the element from the neg stack.
- When the neg stack become empty, store the top value of the pos stack and pop them until it becomes empty.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void moveNegElement( int arr[], int n){
stack< int > neg, pos;
for ( int i=0;i<n;i++){
if (arr[i]<0){
neg.push(arr[i]);
}
else {
pos.push(arr[i]);
}
}
int i=n-1;
while (!neg.empty()){
arr[i--]=neg.top();
neg.pop();
}
while (!pos.empty()){
arr[i--]=pos.top();
pos.pop();
}
}
int main()
{
int arr[] = {1 ,-1 ,-3 , -2, 7, 5, 11, 6 };
int n = sizeof (arr)/ sizeof (arr[0]);
moveNegElement(arr, n);
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
return 0;
}
|
Java
import java.io.*;
import java.util.Stack;
public class GFG {
static void moveNegElement( int [] arr, int n) {
Stack<Integer> neg = new Stack<>();
Stack<Integer> pos = new Stack<>();
for ( int i = 0 ; i < n; i++) {
if (arr[i] < 0 ) {
neg.push(arr[i]);
} else {
pos.push(arr[i]);
}
}
int i = n - 1 ;
while (!neg.isEmpty()) {
arr[i--] = neg.pop();
}
while (!pos.isEmpty()) {
arr[i--] = pos.pop();
}
}
public static void main(String[] args) {
int [] arr = { 1 , - 1 , - 3 , - 2 , 7 , 5 , 11 , 6 };
int n = arr.length;
moveNegElement(arr, n);
for ( int i = 0 ; i < n; i++) {
System.out.print(arr[i] + " " );
}
}
}
|
Python3
def move_neg_elements(arr, n):
neg = []
pos = []
for i in range (n):
if arr[i] < 0 :
neg.append(arr[i])
else :
pos.append(arr[i])
i = n - 1
while neg:
arr[i] = neg.pop()
i - = 1
while pos:
arr[i] = pos.pop()
i - = 1
if __name__ = = "__main__" :
arr = [ 1 , - 1 , - 3 , - 2 , 7 , 5 , 11 , 6 ]
n = len (arr)
move_neg_elements(arr, n)
for i in range (n):
print (arr[i], end = " " )
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void MoveNegElement( int [] arr)
{
Stack< int > neg = new Stack< int >();
Stack< int > pos = new Stack< int >();
foreach ( int element in arr)
{
if (element < 0)
{
neg.Push(element);
}
else
{
pos.Push(element);
}
}
int i = arr.Length - 1;
while (neg.Count > 0)
{
arr[i--] = neg.Pop();
}
while (pos.Count > 0)
{
arr[i--] = pos.Pop();
}
}
static void Main()
{
int [] arr = { 1, -1, -3, -2, 7, 5, 11, 6 };
MoveNegElement(arr);
foreach ( int element in arr)
{
Console.Write(element + " " );
}
Console.WriteLine();
}
}
|
Javascript
function moveNegElement(arr) {
const neg = [];
const pos = [];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < 0) {
neg.push(arr[i]);
} else {
pos.push(arr[i]);
}
}
let i = arr.length - 1;
while (neg.length > 0) {
arr[i--] = neg.pop();
}
while (pos.length > 0) {
arr[i--] = pos.pop();
}
}
const arr = [1, -1, -3, -2, 7, 5, 11, 6];
moveNegElement(arr);
console.log(arr.join( " " ));
|
Output
1 7 5 11 6 -1 -3 -2
Time Complexity: O(n), array traversed from 0 to n-1 in a single loop.
Space Complexity: O(n), used by the stack.
Related Articles:
Rearrange positive and negative numbers with constant extra space
Rearrange positive and negative numbers in O(n) time and O(1) extra space
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.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
02 Dec, 2023
Like Article
Save Article