×

Program to arrange an array in alternate positive and negative numbers

Let’s say, there is given an array arr, arrange the array in such a way that every positive number is followed by a negative number. If there are extra positive or negative numbers, arrange them in such a way that they occur at the end of the array.

Example

Input: 
arr[] = {1, 2, 3, -4, -1, 4}
Output:
arr[] = {-4, 1, -1, 2, 3, 4}

Explanation:

The first negative number is -4. It appears at the start of the array and following it 1, which is the first positive number, so it is aligned next to -4.

Similarly, all the numbers are arranged in the array.

Input:

arr[] = {-5, -2, 5, 2, 4, 7, 1, 8, 0, -8}

Output:

arr[] = {-5, 5, -2, 2, -8, 4, 7, 1, 8, 0}

Explanation:

The first positive number next to -5 is 5, so -2 is shifted to the right. After arranging the alternate positive and negative elements, the extra positive elements are shifted to the right of the array.

  1. Naive approach: Iterate in the array

Find the first out of place of an element which is defined as an element which is negative and at odd index or an element that is positive and at even index.

After finding the out of place element find the element next to it with an opposite sign and rotate the right subarray between these two elements.

CPP code

#include <bits/stdc++.h>
using namespace std;
void rightrotatearray(int arr[], int n, int out_of_place, int current)
{ // function to rotate the right subarray
    char tmp = arr[current];
    for (int i = current; i > out_of_place; i--)
        arr[i] = arr[i - 1];
    arr[out_of_place] = tmp;
}
void rearrangealternate(int arr[], int n) // function to rearrange alternate elements
{
    int out_of_place = -1; // current out of place is -1
    for (int index = 0; index < n; index++)
    {
        if (out_of_place >= 0)
        {
            // find the item which must be moved into the
            // out-of-place entry if out-of-place entry is
            // positive and current entry is negative OR if
            // out-of-place entry is negative and current
            // entry is negative then right rotate
            //
            // [...-3, -4, -5, 6...] -->   [...6, -3, -4,
            // -5...]
            //      ^                          ^
            //      |                          |
            //     outofplace      -->      outofplace
            //
            if (((arr[index] >= 0) && (arr[out_of_place] < 0))
                || ((arr[index] < 0)
                    && (arr[out_of_place] >= 0)))
            {
                rightrotatearray(arr, n, out_of_place, index);
                // the new out-of-place entry is now 2 steps
                // ahead
                if (index - out_of_place >= 2)
                    out_of_place = out_of_place + 2;
                else
                    out_of_place = -1;
            }
        }
        // if no entry has been flagged out-of-place
        if (out_of_place == -1) {
            // check if current entry is out-of-place
            if (((arr[index] >= 0) && (!(index & 0x01)))
                || ((arr[index] < 0) && (index & 0x01))) {
                out_of_place = index;
            }
        }
    }
}
int main()
{
   
    int arr[] = { -5, -2, 5, 2,
                 4, 7, 1, 8, 0, -8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Given array is \n";
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
    rearrangealternate(arr, n);
    cout << "Rearranged array is \n";
   
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}

Output

Given array is
-5 -2 5 2 4 7 1 8 0 -8
Rearranged array is
-5 5 -2 2 -8 4 7 1 8 0

C code

#include <stdio.h>
void rightrotatearray(int arr[], int n, int out_of_place, int current)
{ // function to rotate the right subarray
    char tmp = arr[current];
    for (int i = current; i > out_of_place; i--)
        arr[i] = arr[i - 1];
    arr[out_of_place] = tmp;
}
void rearrangealternate(int arr[], int n) // function to rearrange alternate elements
{
    int out_of_place = -1; // current out of place is -1
    for (int index = 0; index < n; index++)
    {
        if (out_of_place >= 0)
        {
            // find the item which must be moved into the
            // out-of-place entry if out-of-place entry is
            // positive and current entry is negative OR if
            // out-of-place entry is negative and current
            // entry is negative then right rotate
            //
            // [...-3, -4, -5, 6...] -->   [...6, -3, -4,
            // -5...]
            //      ^                          ^
            //      |                          |
            //     outofplace      -->      outofplace
            //
            if (((arr[index] >= 0) && (arr[out_of_place] < 0))
                || ((arr[index] < 0)
                    && (arr[out_of_place] >= 0)))
            {
                rightrotatearray(arr, n, out_of_place, index);
                // the new out-of-place entry is now 2 steps
                // ahead
                if (index - out_of_place >= 2)
                    out_of_place = out_of_place + 2;
                else
                    out_of_place = -1;
            }
        }
        // if no entry has been flagged out-of-place
        if (out_of_place == -1) {
            // check if current entry is out-of-place
            if (((arr[index] >= 0) && (!(index & 0x01)))
                || ((arr[index] < 0) && (index & 0x01))) {
                out_of_place = index;
            }
        }
    }
}
int main()
{
   
    int arr[] = { -5, -2, 5, 2,
                 4, 7, 1, 8, 0, -8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    printf( "Given array is \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
  printf("\n");
    rearrangealternate(arr, n);
    printf( "Rearranged array is \n");
   
    for (int i = 0; i < n; i++)
          printf("%d ", arr[i]);
    return 0;
}

Output

Given array is
-5 -2 5 2 4 7 1 8 0 -8
Rearranged array is
-5 5 -2 2 -8 4 7 1 8 0

Related Topics

Structure Vs Class in C++

The structure in C++ is similar to that of a class, with a few exceptions. Both the structure and the stage, the most important thing is safety. The property is...

4 minutes read.

Boost split in C++ library

Boost::split in C++ library Boost offers strong tools for adding mature, well-tested libraries to the C++ standard library. The boost: split function, which is a component of the Boost string algorithm...

2 minutes read.

C ++ Program: Alphabet Triangle and Number Triangle

Alphabet Triangle and Number Triangle An alphabet triangle is a triangle that typically looks like a pyramid or other triangles like an isosceles triangle, a right-angled triangle consisting of similar or...

4 minutes read.

Data Hiding in C++

C++ : High-performance apps can be made using the cross-platform language C++. Bjarne Stroustrup created C++ as an addition to the C language. Programmers have extensive control over memory and system...

3 minutes read.

Type difference of Character literals in C VS C++

Character literals in C: In C, a character literal is represented by a single character enclosed in single quotes, such as 'a' or 'b'. It is of type int. This means...

5 minutes read.

Initialization of Data Members

In this tutorial, we'll look at how to initialise static member variables in C++. Static members, such as functions or variables, can be added to C++ classes. After declaring the...

1 minute read.

Ways to Copy a Vector in C++

Vectors in C++ are the same as arrays, along with additional outstanding features than them, like array lists in Java programming language. In Vectors, the size constraint is eliminated, which...

5 minutes read.

C++ Date and Time

The date and time formats in C++ will be covered in this article. Because C++ lacks a proper date and time format, we must rely on the c language. The...

7 minutes read.

abs() function in C++

In C++, the abs() function returns the absolute value of any integer number. Using this function a negative integer is multiplied by -1 and positive number or zero is returned...

4 minutes read.

Sliding Window Technique in C++

Sliding Window Technique or Window Sliding Technique is a computational technique that is mainly used to reduce the use of nested loop and replace it with a single loop. It...

4 minutes read.

Principles of Object-Oriented Programming in C++

What is Object-Oriented Programming? Object-oriented programming is about creating obejcts that represent the real-world entity . In object-oriented programming, objects are created for the class. One of the main objectives of...

5 minutes read.

sort() function in C++

This tutorial covers the various built-in sort functions found in the C++ algorithm’s library.  What Does C++ Sort Mean? The concept of sorting in C++ entails rearranging an array's elements in a...

3 minutes read.

C++ storage classes

Storage Classes are used to characterize a variable's or function's characteristics. These characteristics include scope, visibility, and life-time, which allow us to track the presence of a variable over the...

5 minutes read.

C++ Encapsulation

The following two essential components are present in all C++ programmes: Functions are the parts of a programme that perform actions, and they are termed programme statements (code).Program data is the...

4 minutes read.

C++ Overriding

C++ Function Overriding When the base and derive class both contain the same function name and calling the function through derived object invokes derived class function called function overriding. Function overloading is...

1 minute read.

Reverse an Array in C++

The many approaches to reverse an array in the C++ programming language will be discussed in this section. The term "reverse of an array" refers to changing the order of...

8 minutes read.

Hybrid Inheritance

C++ Hybrid Inheritance When more than one type of inheritance is combined in single inheritance is called as hybrid inheritance. C++ Hybrid Inheritance Example #include<iostream>   using namespace std;   class Student{       protected:           int rollno;       public:           void getRoll(int a){               rollno=a;           }           void putRoll(void){               cout <<"Roll No: "<< rollno<<endl;           }   };   class Test : public Student{       protected:           float subject1, subject2;       public:           void getMarks(float x, float y){               subject1=x;               subject2=y;           }           void putMarks(void){               cout<< "Marks gain: "<<endl <<"Subject1 =  "<<subject1<<endl<<"Subject2 = "<<subject2 <<endl;           }   };   class Sport{       protected:           float score;       public:           void getScore(float s){               score=s;           }           void putScore(void){               cout<<"Sports score: "<<score<<endl;           }   };   class Result : public Test, public Sport{       float total;       public:           void display(void);   };   void Result:: display(void){       total=subject1+subject2+score;       putRoll();       putMarks();       putScore();       cout<<"Total Score: "<<total<<endl;   }   int main(){       Result stu;       stu.getRoll(10);       stu.getMarks(40,50);       stu.getScore(60);       stu.display();       return 0;   } Output: Roll No: 10 Marks gain: Subject1 = 40 Subject2 = 50 Sports score: 60 Total...

1 minute read.

Program to arrange an array in alternate positive and negative numbers

Let’s say, there is given an array arr, arrange the array in such a way that every positive number is followed by a negative number. If there are extra positive...

4 minutes read.

C++ Void Pointer

A void pointer is a general purpose pointer that can have an address of any data type but is not related to any data type. Void Pointer Syntax: void *ptr;  We can't...

2 minutes read.

C++ Program to Print Fibonacci Triangle

Fibonacci Triangle Program in CPP Definition: Fibonacci Triangle as the name suggests is the same as the Fibonacci number series where the next element is the sum of the previous two elements....

3 minutes read.