×

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

System() function in C++

As a part of the c/c+ standard library, the system() function passes commands to be executed by the operating system’s command processor or terminal and returns the completed command. We...

2 minutes read.

C++ Program For FCFS (First Come First Serve)

The most basic scheduling technique is FCFS, often known as "FIFO (First In, First Out)". In this procedure, the first one is utilized and executed first, while the second one...

4 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.

Splitting a string in C++

Any programming language must have the ability to work with string data. For programming needs, we sometimes need to separate string data. Many computer languages provide a split() method that...

4 minutes read.

Approach in C++

Object oriented programming languages like Java or C++ use a bottom-up approach that identifies each object first.  In the bottom-up approach, we create a small problem first, and try to...

6 minutes read.

Quick Sort in C++

Quick sort is an efficient, in-place, comparison-based sorting algorithm that uses a divide-and-conquer strategy to sort an array or list of elements. First a pivot element is selected from the...

4 minutes read.

C++ Convert Int to String

In fact, the conversion of numbers to strings or vice versa represents a significant paradigm change. We often need to convert a number to a string or a string to...

2 minutes read.

Iostream in C++

Using Iostream in C++, we can perform input and output operation capabilities. This represents input and output, and the stream is used to carry out this capability. A stream is...

4 minutes read.

C++ array of Pointers

Array of Pointers: In high-level programming languages like C++, the array's name is its pointer. The name of an array contains an address which is the address of an element. In...

4 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.

Binary Operator Overloading in C++

The Binary Operator Overloading in the C++ programming language will be covered in this part. An operator which comprises two operands to execute a mathematical operation is termed the Binary...

6 minutes read.

How to enter a name in C++

A name is a string or array of characters or letters. The string is one of the most helpful data types offered by the C++ library. A string helps the...

4 minutes read.

Bits stdc++.h in C++

<bits/stdc++.h> in C++ In essence, it is a header file that contains all the standard libraries. It makes sense to use this file in programming competitions to speed up work, especially...

2 minutes read.

Find the Size of Array in C/C++ without using sizeof() function

We know that arrays in C/C++ are the most essential data structures as they have the ability to hold the data in a continuous manner line where the address of...

3 minutes read.

C++ Keywords

In this article, we will discuss keywords in C++ with their several features and functions. What are Keywords in C++? In C++, a keyword is a reserved word that has a predefined...

4 minutes read.

Diamond Pattern Using Do-While loop in C++

What is Do-While Loop? An iterative loop that checks the condition at the end.The Do-While loop can be used whenever a test condition is specific, as the control enters the loop...

5 minutes read.

C++ For loop

C++ loop Statement C++ Loop statement allows us to repeat the execution of a statement or group of statements multiple times. The statement(s) repeat execution within loop until the condition of loop...

2 minutes read.

C++ File Handling

File handling is a mechanism that manipulates the data stored in files. File handling store output data from the program to external file and read file data to the program. There...

3 minutes read.

For Loop Examples in C++

For Loop A for loop is a repetitive control structure that allows you to create a loop to execute a specific number of times efficiently. The syntax of for loop In C++, a...

6 minutes read.

Queue in C++

What is Queue? As the name suggests, the queue is the type of data structure that follows the FIFO (First In - First Out) mechanism. In simple words, it is...

4 minutes read.