Given an array of integers (both odd and even), the task is to arrange them in such a way that odd and even values come in alternate fashion in non-decreasing order(ascending) respectively.
- If the smallest value is Even then we have to print Even-Odd pattern.
- If the smallest value is Odd then we have to print Odd-Even pattern.
Note: No. of odd elements must be equal to No. of even elements in the input array.
Examples:
Input: arr[] = {1, 3, 2, 5, 4, 7, 10}
Output: 1, 2, 3, 4, 5, 10, 7
Smallest value is 1(Odd) so output will be Odd-Even pattern.
Input: arr[] = {9, 8, 13, 2, 19, 14}
Output: 2, 9, 8, 13, 14, 19
Smallest value is 2(Even) so output will be Even-Odd pattern.
Asked In: Microsoft Tech-Set-Go-2018
Algorithm:
- Sort the given array.
- Insert Even values in List-1 and Odd values in List-2.
- Now if the smallest value is even, then insert an even value from list 1 and odd value from list 2 to original array and so on.
- But if the smallest value is odd, then insert an odd value from list 2 and even value from list 1 to original array and so on.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void AlternateRearrange( int arr[], int n)
{
sort(arr, arr + n);
vector< int > v1;
vector< int > v2;
for ( int i = 0; i < n; i++)
if (arr[i] % 2 == 0)
v1.push_back(arr[i]);
else
v2.push_back(arr[i]);
int index = 0, i = 0, j = 0;
bool flag = false ;
if (arr[0] % 2 == 0)
flag = true ;
while (index < n) {
if (flag == true ) {
arr[index++] = v1[i++];
flag = !flag;
}
else {
arr[index++] = v2[j++];
flag = !flag;
}
}
for (i = 0; i < n; i++)
cout << arr[i] << " " ;
}
int main()
{
int arr[] = { 9, 8, 13, 2, 19, 14 };
int n = sizeof (arr) / sizeof ( int );
AlternateRearrange(arr, n);
return 0;
}
|
Java
import java.util.* ;
class GFG
{
static void AlternateRearrange( int arr[], int n)
{
Arrays.sort(arr) ;
Vector v1 = new Vector();
Vector v2 = new Vector();
for ( int i = 0 ; i < n; i++)
if (arr[i] % 2 == 0 )
v1.add(arr[i]);
else
v2.add(arr[i]);
int index = 0 , i = 0 , j = 0 ;
boolean flag = false ;
if (arr[ 0 ] % 2 == 0 )
flag = true ;
while (index < n)
{
if (flag == true )
{
arr[index] = ( int )v1.get(i);
i += 1 ;
index += 1 ;
flag = !flag;
}
else
{
arr[index] = ( int )v2.get(j) ;
j += 1 ;
index += 1 ;
flag = !flag;
}
}
for (i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
public static void main(String []args)
{
int arr[] = { 9 , 8 , 13 , 2 , 19 , 14 };
int n = arr.length ;
AlternateRearrange(arr, n);
}
}
|
Python3
def AlternateRearrange(arr, n):
arr.sort()
v1 = list ()
v2 = list ()
for i in range (n):
if (arr[i] % 2 = = 0 ):
v1.append(arr[i])
else :
v2.append(arr[i])
index = 0
i = 0
j = 0
flag = False
if (arr[ 0 ] % 2 = = 0 ):
flag = True
while (index < n):
if (flag = = True and i < len (v1)):
arr[index] = v1[i]
index + = 1
i + = 1
flag = ~flag
elif j < len (v2):
arr[index] = v2[j]
index + = 1
j + = 1
flag = ~flag
for i in range (n):
print (arr[i], end = " " )
arr = [ 9 , 8 , 13 , 2 , 19 , 14 , 21 , 23 , 25 ]
n = len (arr)
AlternateRearrange(arr, n)
|
C#
using System;
using System.Collections;
class GFG
{
static void AlternateRearrange( int []arr, int n)
{
Array.Sort(arr) ;
ArrayList v1 = new ArrayList();
ArrayList v2 = new ArrayList();
for ( int j = 0; j < n; j++)
if (arr[j] % 2 == 0)
v1.Add(arr[j]);
else
v2.Add(arr[j]);
int index = 0, i = 0, k = 0;
bool flag = false ;
if (arr[0] % 2 == 0)
flag = true ;
while (index < n)
{
if (flag == true )
{
arr[index] = ( int )v1[i];
i += 1 ;
index += 1 ;
flag = !flag;
}
else
{
arr[index] = ( int )v2[k] ;
k += 1 ;
index += 1 ;
flag = !flag;
}
}
for (i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
static void Main()
{
int []arr = { 9, 8, 13, 2, 19, 14 };
int n = arr.Length ;
AlternateRearrange(arr, n);
}
}
|
PHP
<?php
function AlternateRearrange( $arr , $n )
{
sort( $arr );
$v1 = array ();
$v2 = array ();
for ( $i = 0; $i < $n ; $i ++)
if ( $arr [ $i ] % 2 == 0)
array_push ( $v1 , $arr [ $i ]);
else
array_push ( $v2 , $arr [ $i ]);
$index = 0;
$i = 0;
$j = 0;
$flag = false;
if ( $arr [0] % 2 == 0)
$flag = true;
while ( $index < $n )
{
if ( $flag == true)
{
$arr [ $index ++] = $v1 [ $i ++];
$flag = ! $flag ;
}
else
{
$arr [ $index ++] = $v2 [ $j ++];
$flag = ! $flag ;
}
}
for ( $i = 0; $i < $n ; $i ++)
echo $arr [ $i ], " " ;
}
$arr = array ( 9, 8, 13, 2, 19, 14 );
$n = sizeof( $arr );
AlternateRearrange( $arr , $n );
?>
|
Javascript
<script>
function AlternateRearrange(arr, n)
{
arr.sort((a,b)=>a-b);
var v1 = [];
var v2 = [];
for ( var i = 0; i < n; i++)
if (arr[i] % 2 == 0)
v1.push(arr[i]);
else
v2.push(arr[i]);
var index = 0, i = 0, j = 0;
var flag = false ;
if (arr[0] % 2 == 0)
flag = true ;
while (index < n) {
if (flag == true ) {
arr[index++] = v1[i++];
flag = !flag;
}
else {
arr[index++] = v2[j++];
flag = !flag;
}
}
for (i = 0; i < n; i++)
document.write( arr[i] + " " );
}
var arr = [9, 8, 13, 2, 19, 14];
var n = arr.length;
AlternateRearrange(arr, n);
</script>
|
Complexity Analysis:
- Time Complexity: O(N * logN)
- Auxiliary Space: O(N)
Efficient Approach :
We can use a pointer ‘wrong’ to point to the point to the wrong index of an element. Initially, we point wrong to -1, implying that wrong is not existing. If we come across another mistake, we swap both the mistakes and put wrong as -1, as both wrongs are swapped, and no wrongs exist until the traversed point.
Algorithm:
-> Sort the input vector
-> If the smallest number is even, every even index must have an even number and odd index must have an odd number. If this condition fails, initialize wrong as i if wrong = -1, or else swap wrong and i indices. Then put wrong = -1
-> If smallest number is odd, every even index must have an odd number and every odd index must have an even number. If this condition fails, initialize wrong as i if wrong = -1 or else swap wrong and i indices. Then put wrong = -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void AlternateRearrange(vector< int >& arr, int n)
{
int wrong = -1;
sort(arr.begin(), arr.end());
if (arr[0] % 2 == 0) {
for ( int i = 0; i < n; i++) {
if ((i % 2 == 0 && arr[i] % 2 != 0)
|| (i % 2 == 1 && arr[i] % 2 != 1)) {
if (wrong != -1) {
swap(arr[i], arr[wrong]);
wrong = -1;
}
else {
wrong = i;
}
}
}
}
else {
for ( int i = 0; i < n; i++) {
if ((i % 2 == 0 && arr[i] % 2 != 1)
|| (i % 2 == 1 && arr[i] % 2 != 0)) {
if (wrong != -1) {
swap(arr[i], arr[wrong]);
wrong = -1;
}
else {
wrong = i;
}
}
}
}
}
void printArray(vector< int >& arr, int n)
{
for ( int i = 0; i < n; i++) {
cout << arr[i] << " " ;
}
cout << endl;
}
int main()
{
vector< int > arr = { 9, 8, 13, 2, 19, 14 };
int n = sizeof (arr) / sizeof (arr[0]);
printArray(arr, n);
AlternateRearrange(arr, n);
printArray(arr, n);
return 0;
}
|
Java
import java.util.*;
public class Main {
public static void
AlternateRearrange(ArrayList<Integer> arr, int n)
{
int wrong = - 1 ;
Collections.sort(arr);
if (arr.get( 0 ) % 2
== 0 ) {
for ( int i = 0 ; i < n; i++) {
if ((i % 2 == 0
&& arr.get(i) % 2
!= 0 )
|| (i % 2 == 1
&& arr.get(i) % 2
!= 1 )) {
if (wrong != - 1 ) {
Collections.swap(
arr, i,
wrong);
wrong = - 1 ;
}
else {
wrong = i;
}
}
}
}
else {
for ( int i = 0 ; i < n; i++) {
if ((i % 2 == 0
&& arr.get(i) % 2
!= 1 )
|| (i % 2 == 1
&& arr.get(i) % 2
!= 0 )) {
if (wrong != - 1 ) {
Collections.swap(
arr, i,
wrong);
wrong = - 1 ;
}
else {
wrong = i;
}
}
}
}
}
public static void printArray(ArrayList<Integer> arr,
int n)
{
for ( int i = 0 ; i < n; i++) {
System.out.print(arr.get(i) + " " );
}
System.out.println();
}
public static void main(String[] args)
{
ArrayList<Integer> arr = new ArrayList<>(
Arrays.asList( 9 , 8 , 13 , 2 , 19 , 14 ));
int n = arr.size();
printArray(arr, n);
AlternateRearrange(arr, n);
printArray(arr, n);
}
}
|
Python3
def AlternateRearrange(l):
wrong = - 1
l.sort()
if (l[ 0 ] % 2 = = 0 ):
for i in range ( len (l)):
if (i % 2 = = 0 and l[i] % 2 ! = 0 ) or (i % 2 = = 1 and l[i] % 2 ! = 1 ):
if wrong ! = - 1 :
l[i], l[wrong] = l[wrong], l[i]
wrong = - 1
else :
wrong = i
else :
for i in range ( len (l)):
if (i % 2 = = 0 and l[i] % 2 ! = 1 ) or (i % 2 = = 1 and l[i] % 2 ! = 0 ):
if wrong ! = - 1 :
l[i], l[wrong] = l[wrong], l[i]
wrong = - 1
else :
wrong = i
def printArray(l):
for i in range ( len (l)):
print (l[i], end = " " )
print ()
l = [ 9 , 8 , 13 , 2 , 19 , 14 ]
printArray(l)
AlternateRearrange(l)
printArray(l)
|
C#
using System;
public class Program
{
static void AlternateRearrange( int [] l)
{
int wrong = -1;
Array.Sort(l);
if (l[0] % 2 == 0)
{
for ( int i = 0; i < l.Length; i++)
{
if ((i % 2 == 0 && l[i] % 2 != 0) || (i % 2 == 1 && l[i] % 2 != 1))
{
if (wrong != -1)
{
int temp = l[wrong];
l[wrong] = l[i];
l[i] = temp;
wrong = -1;
}
else
{
wrong = i;
}
}
}
}
else
{
for ( int i = 0; i < l.Length; i++)
{
if ((i % 2 == 0 && l[i] % 2 != 1) || (i % 2 == 1 && l[i] % 2 != 0))
{
if (wrong != -1)
{
int temp = l[wrong];
l[wrong] = l[i];
l[i] = temp;
wrong = -1;
}
else
{
wrong = i;
}
}
}
}
}
static void PrintArray( int [] l)
{
for ( int i = 0; i < l.Length; i++)
{
Console.Write(l[i] + " " );
}
Console.WriteLine();
}
public static void Main()
{
int [] l = { 9, 8, 13, 2, 19, 14 };
PrintArray(l);
AlternateRearrange(l);
PrintArray(l);
}
}
|
Javascript
function AlternateRearrange(arr) {
let n = arr.length;
let wrong = -1;
arr.sort((a, b) => a - b);
if (arr[0] % 2 == 0) {
for (let i = 0; i < n; i++) {
if ((i % 2 == 0 && arr[i] % 2 != 0)
|| (i % 2 == 1 && arr[i] % 2 != 1)) {
if (wrong != -1) {
[arr[i], arr[wrong]] = [arr[wrong], arr[i]];
wrong = -1;
}
else {
wrong = i;
}
}
}
}
else {
for (let i = 0; i < n; i++) {
if ((i % 2 == 0 && arr[i] % 2 != 1)
|| (i % 2 == 1 && arr[i] % 2 != 0)) {
if (wrong != -1) {
[arr[i], arr[wrong]] = [arr[wrong], arr[i]];
wrong = -1;
}
else {
wrong = i;
}
}
}
}
return arr;
}
function printArray(arr) {
console.log(arr.join( " " ));
}
let arr = [9, 8, 13, 2, 19, 14];
printArray(arr);
arr = AlternateRearrange(arr);
printArray(arr);
|
Output:
2 9 8 13 14 19
Time Complexity Analysis:
- Time Complexity: O(N * logN), where N is the size of the array
- Auxiliary Space: O(1), where N is the size of the array