Given an array of positive and negative numbers, arrange them in an alternate fashion such that every positive number is followed by negative and vice-versa. Order of elements in output doesn’t matter. Extra positive or negative elements should be moved to end.
Examples:
Input :
arr[] = {-2, 3, 4, -1}
Output :
arr[] = {-2, 3, -1, 4} OR {-1, 3, -2, 4} OR ..
Input :
arr[] = {-2, 3, 1}
Output :
arr[] = {-2, 3, 1} OR {-2, 1, 3}
Input :
arr[] = {-5, 3, 4, 5, -6, -2, 8, 9, -1, -4}
Output :
arr[] = {-5, 3, -2, 5, -6, 4, -4, 9, -1, 8}
OR ..
Approach 1:
- First, sort the array in non-increasing order. Then we will count the number of positive and negative integers.
- Then swap the one negative and one positive number in the odd positions till we reach our condition.
- This will rearrange the array elements because we are sorting the array and accessing the element from left to right according to our need.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void fill1( int a[], int neg, int pos)
{
if (neg % 2 == 1) {
for ( int i = 1; i < neg; i += 2) {
int c = a[i];
int d = a[i + neg];
int temp = c;
a[i] = d;
a[i + neg] = temp;
}
}
else {
for ( int i = 1; i <= neg; i += 2) {
int c = a[i];
int d = a[i + neg - 1];
int temp = c;
a[i] = d;
a[i + neg - 1] = temp;
}
}
}
void fill2( int a[], int neg, int pos)
{
if (pos % 2 == 1) {
for ( int i = 1; i < pos; i += 2) {
int c = a[i];
int d = a[i + pos];
int temp = c;
a[i] = d;
a[i + pos] = temp;
}
}
else {
for ( int i = 1; i <= pos; i += 2) {
int c = a[i];
int d = a[i + pos - 1];
int temp = c;
a[i] = d;
a[i + pos - 1] = temp;
}
}
}
void reverse( int a[], int n)
{
int i, k, t;
for (i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
}
void print( int a[], int n)
{
for ( int i = 0; i < n; i++)
cout << a[i] << " " ;
cout << endl;
}
int main()
{
int arr[] = { 2, 3, -4, -1, 6, -9 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Given array is " ;
print(arr, n);
int neg = 0, pos = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] < 0)
neg++;
else
pos++;
}
sort(arr, arr + n);
if (neg <= pos)
fill1(arr, neg, pos);
else {
reverse(arr, n);
fill2(arr, neg, pos);
}
cout << "Rearranged array is " ;
print(arr, n);
}
|
C
#include <stdio.h>
#include <stdlib.h>
int cmpfunc( const void * a, const void * b)
{
return (*( int *)a - *( int *)b);
}
void fill1( int a[], int neg, int pos)
{
if (neg % 2 == 1) {
for ( int i = 1; i < neg; i += 2) {
int c = a[i];
int d = a[i + neg];
int temp = c;
a[i] = d;
a[i + neg] = temp;
}
}
else {
for ( int i = 1; i <= neg; i += 2) {
int c = a[i];
int d = a[i + neg - 1];
int temp = c;
a[i] = d;
a[i + neg - 1] = temp;
}
}
}
void fill2( int a[], int neg, int pos)
{
if (pos % 2 == 1) {
for ( int i = 1; i < pos; i += 2) {
int c = a[i];
int d = a[i + pos];
int temp = c;
a[i] = d;
a[i + pos] = temp;
}
}
else {
for ( int i = 1; i <= pos; i += 2) {
int c = a[i];
int d = a[i + pos - 1];
int temp = c;
a[i] = d;
a[i + pos - 1] = temp;
}
}
}
void reverse( int a[], int n)
{
int i, k, t;
for (i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
}
void print( int a[], int n)
{
for ( int i = 0; i < n; i++)
printf ( "%d " , a[i]);
printf ( "\n" );
}
int main()
{
int arr[] = { 2, 3, -4, -1, 6, -9 };
int n = sizeof (arr) / sizeof (arr[0]);
printf ( "Given array is " );
print(arr, n);
int neg = 0, pos = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] < 0)
neg++;
else
pos++;
}
qsort (arr, n, sizeof ( int ), cmpfunc);
if (neg <= pos)
fill1(arr, neg, pos);
else {
reverse(arr, n);
fill2(arr, neg, pos);
}
printf ( "Rearranged array is " );
print(arr, n);
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
static void fill1( int a[], int neg, int pos)
{
if (neg % 2 == 1 ) {
for ( int i = 1 ; i < neg; i += 2 ) {
int c = a[i];
int d = a[i + neg];
int temp = c;
a[i] = d;
a[i + neg] = temp;
}
}
else {
for ( int i = 1 ; i <= neg; i += 2 ) {
int c = a[i];
int d = a[i + neg - 1 ];
int temp = c;
a[i] = d;
a[i + neg - 1 ] = temp;
}
}
}
static void fill2( int a[], int neg, int pos)
{
if (pos % 2 == 1 ) {
for ( int i = 1 ; i < pos; i += 2 ) {
int c = a[i];
int d = a[i + pos];
int temp = c;
a[i] = d;
a[i + pos] = temp;
}
}
else {
for ( int i = 1 ; i <= pos; i += 2 ) {
int c = a[i];
int d = a[i + pos - 1 ];
int temp = c;
a[i] = d;
a[i + pos - 1 ] = temp;
}
}
}
static void reverse( int a[], int n)
{
int i, k, t;
for (i = 0 ; i < n / 2 ; i++) {
t = a[i];
a[i] = a[n - i - 1 ];
a[n - i - 1 ] = t;
}
}
static void print( int a[], int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(a[i] + " " );
System.out.println();
}
public static void main(String[] args)
throws java.lang.Exception
{
int [] arr = { 2 , 3 , - 4 , - 1 , 6 , - 9 };
int n = arr.length;
System.out.println( "Given array is " );
print(arr, n);
int neg = 0 , pos = 0 ;
for ( int i = 0 ; i < n; i++) {
if (arr[i] < 0 )
neg++;
else
pos++;
}
Arrays.sort(arr);
if (neg <= pos) {
fill1(arr, neg, pos);
}
else {
reverse(arr, n);
fill2(arr, neg, pos);
}
System.out.println( "Rearranged array is " );
print(arr, n);
}
}
|
Python3
def fill1(a, neg, pos) :
if (neg % 2 = = 1 ) :
for i in range ( 1 , neg, 2 ):
c = a[i]
d = a[i + neg]
temp = c
a[i] = d
a[i + neg] = temp
else :
for i in range ( 1 , neg + 1 , 2 ):
c = a[i]
d = a[i + neg - 1 ]
temp = c
a[i] = d
a[i + neg - 1 ] = temp
def fill2(a, neg, pos):
if (pos % 2 = = 1 ) :
for i in range ( 1 , pos, 2 ):
c = a[i]
d = a[i + pos]
temp = c
a[i] = d
a[i + pos] = temp
else :
for i in range ( 1 , pos + 1 , 2 ):
c = a[i]
d = a[i + pos - 1 ]
temp = c
a[i] = d
a[i + pos - 1 ] = temp
def reverse(a, n) :
for i in range (n / 2 ):
t = a[i]
a[i] = a[n - i - 1 ]
a[n - i - 1 ] = t
def printt(a, n):
for i in range (n):
print (a[i], end = " " )
print ()
if __name__ = = "__main__" :
arr = [ 2 , 3 , - 4 , - 1 , 6 , - 9 ]
n = len (arr)
print ( "Given array is " )
printt(arr, n)
neg = 0
pos = 0
for i in range ( 0 , n):
if (arr[i] < 0 ):
neg + = 1
else :
pos + = 1
arr.sort()
if (neg < = pos) :
fill1(arr, neg, pos)
else :
reverse(arr, n)
fill2(arr, neg, pos)
print ( "Rearranged array is " )
printt(arr, n)
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
public class GFG {
static void fill1( int [] a, int neg, int pos)
{
if (neg % 2 == 1) {
for ( int i = 1; i < neg; i += 2) {
int c = a[i];
int d = a[i + neg];
int temp = c;
a[i] = d;
a[i + neg] = temp;
}
}
else {
for ( int i = 1; i <= neg; i += 2) {
int c = a[i];
int d = a[i + neg - 1];
int temp = c;
a[i] = d;
a[i + neg - 1] = temp;
}
}
}
static void fill2( int [] a, int neg, int pos)
{
if (pos % 2 == 1) {
for ( int i = 1; i < pos; i += 2) {
int c = a[i];
int d = a[i + pos];
int temp = c;
a[i] = d;
a[i + pos] = temp;
}
}
else {
for ( int i = 1; i <= pos; i += 2) {
int c = a[i];
int d = a[i + pos - 1];
int temp = c;
a[i] = d;
a[i + pos - 1] = temp;
}
}
}
static void reverse( int [] a, int n)
{
int i, k, t;
for (i = 0; i < n / 2; i++) {
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
}
static void print( int [] a, int n)
{
for ( int i = 0; i < n; i++)
Console.Write(a[i] + " " );
Console.WriteLine();
}
public static void Main ( string [] args) {
int [] arr = { 2, 3, -4, -1, 6, -9 };
int n = arr.Length;
Console.WriteLine( "Given array is " );
print(arr, n);
int neg = 0, pos = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] < 0)
neg++;
else
pos++;
}
Array.Sort(arr);
if (neg <= pos) {
fill1(arr, neg, pos);
}
else {
reverse(arr, n);
fill2(arr, neg, pos);
}
Console.WriteLine( "Rearranged array is " );
print(arr, n);
}
}
|
Javascript
<script>
function fill1(a, neg, pos)
{
if (neg % 2 == 1)
{
for (let i = 1; i < neg; i += 2)
{
let c = a[i];
let d = a[i + neg];
let temp = c;
a[i] = d;
a[i + neg] = temp;
}
}
else
{
for (let i = 1; i <= neg; i += 2)
{
let c = a[i];
let d = a[i + neg - 1];
let temp = c;
a[i] = d;
a[i + neg - 1] = temp;
}
}
}
function fill2(a, neg, pos)
{
if (pos % 2 == 1)
{
for (let i = 1; i < pos; i += 2)
{
let c = a[i];
let d = a[i + pos];
let temp = c;
a[i] = d;
a[i + pos] = temp;
}
}
else
{
for (let i = 1; i <= pos; i += 2)
{
let c = a[i];
let d = a[i + pos - 1];
let temp = c;
a[i] = d;
a[i + pos - 1] = temp;
}
}
}
function reverse(a, n)
{
let i, k, t;
for (i = 0; i < parseInt(n / 2); i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
}
function print(a, n)
{
for (let i = 0; i < n; i++)
document.write(a[i] + " " );
document.write( '<br>' );
}
var arr = [ 2, 3, -4, -1, 6, -9 ];
let n = arr.length;
document.write( "Given array is " );
print(arr, n);
let neg = 0, pos = 0;
for (let i = 0; i < n; i++)
{
if (arr[i] < 0)
neg++;
else
pos++;
}
arr.sort( function (a, b){ return a - b;});
if (neg <= pos)
{
fill1(arr, neg, pos);
}
else
{
reverse(arr, n);
fill2(arr, neg, pos);
}
document.write( "Rearranged array is " );
print(arr, n);
</script>
|
Output
Given array is 2 3 -4 -1 6 -9
Rearranged array is -9 3 -1 2 -4 6
Time Complexity: O(N*logN)
Space Complexity: O(1)
Efficient Approach: We have already discussed a O(n2) solution that maintains the order of appearance in the array here. If we are allowed to change order of appearance, we can solve this problem in O(n) time and O(1) space.
The idea is to process the array and shift all negative values to the end in O(n) time. After all negative values are shifted to the end, we can easily rearrange array in alternating positive & negative items. We basically swap next positive element at even position from next negative element in this step.
Following is the implementation of above idea.
C++
#include <bits/stdc++.h>
using namespace std;
void rearrange( int arr[], int n)
{
int i = 0, j = n-1;
while (i < j) {
while (i <= n - 1 and arr[i] > 0)
i += 1;
while (j >= 0 and arr[j] < 0)
j -= 1;
if (i < j )
swap(arr[i], arr[j]);
}
if (i == 0 || i == n)
return ;
int k = 0;
while (k < n && i < n ) {
swap(arr[k], arr[i]);
i = i + 1;
k = k + 2;
}
}
void printArray( int arr[], int n)
{
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
cout << endl;
}
int main()
{
int arr[] = { 2, 3, -4, -1, 6, -9 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << "Given array is \n" ;
printArray(arr, n);
rearrange(arr, n);
cout << "Rearranged array is \n" ;
printArray(arr, n);
return 0;
}
|
Java
class GFG {
static void rearrange( int arr[], int n)
{
int i = 0 , j = n - 1 ;
while (i < j) {
while (i <= n - 1 && arr[i] > 0 )
i += 1 ;
while (j >= 0 && arr[j] < 0 )
j -= 1 ;
if (i < j)
swap(arr, i, j);
}
if (i == 0 || i == n)
return ;
int k = 0 ;
while (k < n && i < n) {
swap(arr, k, i);
i = i + 1 ;
k = k + 2 ;
}
}
static void printArray( int arr[], int n)
{
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
System.out.println( "" );
}
static void swap( int arr[], int index1, int index2)
{
int c = arr[index1];
arr[index1] = arr[index2];
arr[index2] = c;
}
public static void main(String[] args)
{
int arr[] = { 2 , 3 , - 4 , - 1 , 6 , - 9 };
int n = arr.length;
System.out.println( "Given array is " );
printArray(arr, n);
rearrange(arr, n);
System.out.println( "Rearranged array is " );
printArray(arr, n);
}
}
|
Python3
def rearrange(arr, n):
i = 0
j = n - 1
while (i < j):
while (i < = n - 1 and arr[i] > 0 ):
i + = 1
while (j > = 0 and arr[j] < 0 ):
j - = 1
if (i < j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
if (i = = 0 or i = = n):
return 0
k = 0
while (k < n and i < n):
temp = arr[k]
arr[k] = arr[i]
arr[i] = temp
i = i + 1
k = k + 2
def printArray(arr, n):
for i in range (n):
print (arr[i], end = " " )
print ( "\n" )
arr = [ 2 , 3 ]
n = len (arr)
print ( "Given array is" )
printArray(arr, n)
rearrange(arr, n)
print ( "Rearranged array is" )
printArray(arr, n)
|
C#
using System;
class GFG {
static void rearrange( int [] arr, int n)
{
int i = 0, j = n - 1;
while (i < j) {
while (i <= n - 1 && arr[i] > 0)
i += 1;
while (j >= 0 && arr[j] < 0)
j -= 1;
if (i < j)
swap(arr, i, j);
}
if (i == 0 || i == n)
return ;
int k = 0;
while (k < n && i < n) {
swap(arr, k, i);
i = i + 1;
k = k + 2;
}
}
static void printArray( int [] arr, int n)
{
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
Console.WriteLine( "" );
}
static void swap( int [] arr, int index1, int index2)
{
int c = arr[index1];
arr[index1] = arr[index2];
arr[index2] = c;
}
public static void Main()
{
int [] arr = { 2, 3, -4, -1, 6, -9 };
int n = arr.Length;
Console.WriteLine( "Given array is " );
printArray(arr, n);
rearrange(arr, n);
Console.WriteLine( "Rearranged array is " );
printArray(arr, n);
}
}
|
PHP
<?php
function rearrange(& $arr , $n )
{
$i = 0;
$j = $n - 1;
while ( $i < $j )
{
while ( $i <= $n - 1 and $arr [ $i ] > 0)
++ $i ;
while ( $j >= 0 and $arr [ $j ] < 0)
-- $j ;
if ( $i < $j )
{
$temp = $arr [ $i ];
$arr [ $i ] = $arr [ $j ];
$arr [ $j ] = $temp ;
}
}
if ( $i == 0 || $i == $n )
return ;
$k = 0;
while ( $k < $n && $i < $n )
{
$temp = $arr [ $k ];
$arr [ $k ] = $arr [ $i ];
$arr [ $i ] = $temp ;
$i = $i + 1;
$k = $k + 2;
}
}
function printArray(& $arr , $n )
{
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ] . " " ;
echo "\n" ;
}
$arr = array (2, 3, -4, -1, 6, -9);
$n = sizeof( $arr );
echo "Given array is \n" ;
printArray( $arr , $n );
rearrange( $arr , $n );
echo "Rearranged array is \n" ;
printArray( $arr , $n );
?>
|
Javascript
<script>
function rearrange(arr,n)
{
let i = 0, j = n - 1;
while (i < j)
{
while (i <= n - 1 && arr[i] > 0)
i += 1;
while (j >= 0 && arr[j] < 0)
j -= 1;
if (i < j)
swap(arr, i,j);
}
if (i == 0 || i == n)
return ;
let k = 0;
while (k < n && i < n)
{
swap(arr, k, i);
i = i + 1;
k = k + 2;
}
}
function printArray(arr, n)
{
for (let i = 0; i < n; i++)
document.write(arr[i] + " " );
document.write( "<br>" );
}
function swap(arr, index1, index2)
{
let c = arr[index1];
arr[index1] = arr[index2];
arr[index2] = c;
}
let arr = [ 2, 3, -4, -1, 6, -9 ];
let n = arr.length;
document.write( "Given array is <br>" );
printArray(arr, n);
rearrange(arr, n);
document.write( "Rearranged array is <br>" );
printArray(arr, n);
</script>
|
Output
Given array is
2 3 -4 -1 6 -9
Rearranged array is
-1 3 -4 2 -9 6
Time Complexity : O(N)
Space Complexity : O(1)
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
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!