Given an array arr[] containing equal number of odd and even numbers, arrange the numbers such that all even numbers are placed at even indices and odd numbers at odd indices.
Note: There are multiple possible solutions, print any one of them. Also, 0-based indexing is considered.
Examples :Â
Input: arr[] = [3, 6, 12, 1, 5, 8]
Output: 1
Explanation: Place even numbers at even indices and odd at odd indices, One valid arrangement: 6 3 12 1 8 5.
Input: arr[] = [1, 2, 3, 4]
Output: 1
Explanation: Place even numbers at even indices and odd at odd indices, One valid arrangement: 2 1 4 3.
Table of Content
[Naive Approach] Using Separate Lists - O(n) Time O(n) Space
The idea is to store even and odd elements in separate lists, then fill the array by placing evens at even indices and odds at odd indices.
#include <iostream>
#include <vector>
using namespace std;
void reArrange(vector<int> &arr)
{
// Vectors to store even and odd numbers
vector<int> even, odd;
// Separate even and odd elements
for (int i = 0; i < arr.size(); i++)
{
if (arr[i] % 2 == 0)
even.push_back(arr[i]);
else
odd.push_back(arr[i]);
}
int e = 0, o = 0;
// Fill array with correct positions
for (int i = 0; i < arr.size(); i++)
{
// Place even numbers at even indices
if (i % 2 == 0)
arr[i] = even[e++];
// Place odd numbers at odd indices
else
arr[i] = odd[o++];
}
}
int main()
{
vector<int> arr = {3, 6, 12, 1, 5, 8};
reArrange(arr);
for(int i=0; i<arr.size(); i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
void reArrange(int *arr, int size)
{
// Arrays to store even and odd numbers
int *even = (int *)malloc(size * sizeof(int));
int *odd = (int *)malloc(size * sizeof(int));
int e = 0, o = 0;
// Separate even and odd elements
for (int i = 0; i < size; i++)
{
if (arr[i] % 2 == 0)
even[e++] = arr[i];
else
odd[o++] = arr[i];
}
e = 0;
o = 0;
// Fill array with correct positions
for (int i = 0; i < size; i++)
{
// Place even numbers at even indices
if (i % 2 == 0)
arr[i] = even[e++];
// Place odd numbers at odd indices
else
arr[i] = odd[o++];
}
free(even);
free(odd);
}
int main()
{
int arr[] = {3, 6, 12, 1, 5, 8};
int size = sizeof(arr) / sizeof(arr[0]);
reArrange(arr, size);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
public class GfG {
public static void reArrange(int[] arr) {
// Arrays to store even and odd numbers
int[] even = new int[arr.length];
int[] odd = new int[arr.length];
int e = 0, o = 0;
// Separate even and odd elements
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0)
even[e++] = arr[i];
else
odd[o++] = arr[i];
}
// Fill array with correct positions
for (int i = 0; i < arr.length; i++) {
// Place even numbers at even indices
if (i % 2 == 0)
arr[i] = even[--e];
// Place odd numbers at odd indices
else
arr[i] = odd[--o];
}
// Print the modified array
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args) {
int[] arr = {3, 6, 12, 1, 5, 8};
reArrange(arr);
}
}
def reArrange(arr):
# Lists to store even and odd numbers
even = []
odd = []
# Separate even and odd elements
for i in range(len(arr)):
if arr[i] % 2 == 0:
even.append(arr[i])
else:
odd.append(arr[i])
e = 0
o = 0
# Fill array with correct positions
for i in range(len(arr)):
# Place even numbers at even indices
if i % 2 == 0:
arr[i] = even[e]
e += 1
# Place odd numbers at odd indices
else:
arr[i] = odd[o]
o += 1
# Driver Code
if __name__ == "__main__":
arr = [3, 6, 12, 1, 5, 8]
reArrange(arr)
print(arr)
using System;
using System.Collections.Generic;
public class GfG
{
public static void reArrange(List<int> arr)
{
// Lists to store even and odd numbers
List<int> even = new List<int>();
List<int> odd = new List<int>();
// Separate even and odd elements
for (int i = 0; i < arr.Count; i++)
{
if (arr[i] % 2 == 0)
even.Add(arr[i]);
else
odd.Add(arr[i]);
}
int e = 0, o = 0;
// Fill array with correct positions
for (int i = 0; i < arr.Count; i++)
{
// Place even numbers at even indices
if (i % 2 == 0)
arr[i] = even[e++];
// Place odd numbers at odd indices
else
arr[i] = odd[o++];
}
}
public static void Main()
{
List<int> arr = new List<int> {3, 6, 12, 1, 5, 8};
reArrange(arr);
Console.WriteLine(string.Join(", ", arr));
}
}
function reArrange(arr) {
// Arrays to store even and odd numbers
let even = [];
let odd = [];
// Separate even and odd elements
for (let i = 0; i < arr.length; i++) {
if (arr[i] % 2 === 0)
even.push(arr[i]);
else
odd.push(arr[i]);
}
let e = 0, o = 0;
// Fill array with correct positions
for (let i = 0; i < arr.length; i++) {
// Place even numbers at even indices
if (i % 2 === 0)
arr[i] = even[e++];
// Place odd numbers at odd indices
else
arr[i] = odd[o++];
}
// Print modified array
console.log(arr);
}
// Driver Code
let arr = [3, 6, 12, 1, 5, 8];
reArrange(arr);
Output
1
Time complexity:Â O(n)
Auxiliary Space:Â O(n)
[Expected Approach] Using Two Pointer Swap - O(n) Time O(1) Space
The idea is to use two pointers for even and odd indices. If both positions have wrong elements, swap them to fix two positions in one step.
Let us understand with an example:
Input: arr = [3, 6, 12, 1, 5, 8]
- Start: evenInd = 0, oddInd = 1, arr = [3, 6, 12, 1, 5, 8]
- evenInd = 0 (3 is odd -> wrong), oddInd = 1 (6 is even -> wrong) -> swap -> [6, 3, 12, 1, 5, 8]
- Move pointers -> evenInd = 4 (5 is odd -> wrong), oddInd = 5 (8 is even -> wrong) -> swap -> [6, 3, 12, 1, 8, 5]
- Both pointers go out of range -> stop
Final Array: [6, 3, 12, 1, 8, 5], Output: 1
#include <iostream>
#include <vector>
using namespace std;
void reArrange(vector<int> &arr)
{
int n = arr.size();
// Initialize pointers for even and odd indices
int evenInd = 0, oddInd = 1;
// Traverse until either pointer goes out of range
while (true)
{
// Move even pointer if element is correctly placed
while (evenInd < n && arr[evenInd] % 2 == 0)
evenInd += 2;
// Move odd pointer if element is correctly placed
while (oddInd < n && arr[oddInd] % 2 == 1)
oddInd += 2;
// Swap misplaced elements
if (evenInd < n && oddInd < n)
swap(arr[evenInd], arr[oddInd]);
else
break;
}
}
// Driver Code
int main()
{
vector<int> arr = {3, 6, 12, 1, 5, 8};
reArrange(arr);
for(int i=0; i<arr.size(); i++) {
cout << arr[i] << " ";
}
return 0;
}
#include <stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void reArrange(int arr[], int n)
{
// Initialize pointers for even and odd indices
int evenInd = 0, oddInd = 1;
// Traverse until either pointer goes out of range
while (1)
{
// Move even pointer if element is correctly placed
while (evenInd < n && arr[evenInd] % 2 == 0)
evenInd += 2;
// Move odd pointer if element is correctly placed
while (oddInd < n && arr[oddInd] % 2 == 1)
oddInd += 2;
// Swap misplaced elements
if (evenInd < n && oddInd < n)
swap(&arr[evenInd], &arr[oddInd]);
else
break;
}
}
// Driver Code
int main()
{
int arr[] = {3, 6, 12, 1, 5, 8};
int n = sizeof(arr) / sizeof(arr[0]);
reArrange(arr, n);
printf("Rearranged array:\n");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
import java.util.Arrays;
public class GfG {
static void swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static void reArrange(int[] arr)
{
int n = arr.length;
// Initialize pointers for even and odd indices
int evenInd = 0, oddInd = 1;
// Traverse until either pointer goes out of range
while (true)
{
// Move even pointer if element is correctly placed
while (evenInd < n && arr[evenInd] % 2 == 0)
evenInd += 2;
// Move odd pointer if element is correctly placed
while (oddInd < n && arr[oddInd] % 2 == 1)
oddInd += 2;
// Swap misplaced elements
if (evenInd < n && oddInd < n)
swap(arr, evenInd, oddInd);
else
break;
}
}
public static void main(String[] args)
{
int[] arr = {3, 6, 12, 1, 5, 8};
reArrange(arr);
System.out.println(Arrays.toString(arr));
}
}
def reArrange(arr):
n = len(arr)
# Initialize pointers for even and odd indices
evenInd = 0
oddInd = 1
# Traverse until either pointer goes out of range
while True:
# Move even pointer if element is correctly placed
while evenInd < n and arr[evenInd] % 2 == 0:
evenInd += 2
# Move odd pointer if element is correctly placed
while oddInd < n and arr[oddInd] % 2 == 1:
oddInd += 2
# if both pointers are within range, then swap
if evenInd < n and oddInd < n:
arr[evenInd], arr[oddInd] = arr[oddInd], arr[evenInd]
else:
break
# Driver Code
if __name__ == "__main__":
arr = [3, 6, 12, 1, 5, 8]
reArrange(arr)
print(arr)
using System;
public class GfG
{
static void Swap(int[] arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
static int reArrange(int[] arr)
{
int n = arr.Length;
// Initialize pointers for even and odd indices
int evenInd = 0, oddInd = 1;
// Traverse until either pointer goes out of range
while (true)
{
// Move even pointer if element is correctly placed
while (evenInd < n && arr[evenInd] % 2 == 0)
evenInd += 2;
// Move odd pointer if element is correctly placed
while (oddInd < n && arr[oddInd] % 2 == 1)
oddInd += 2;
// Swap misplaced elements
if (evenInd < n && oddInd < n)
Swap(arr, evenInd, oddInd);
else
break;
}
// Return 1 for successful rearrangement
return 1;
}
static void Main()
{
int[] arr = {3, 6, 12, 1, 5, 8};
int res = reArrange(arr);
Console.WriteLine(res);
}
}
function reArrange(arr) {
let n = arr.length;
// Initialize pointers for even and odd indices
let evenInd = 0;
let oddInd = 1;
// Traverse until either pointer goes out of range
while (true) {
// Move even pointer if element is correctly placed
while (evenInd < n && arr[evenInd] % 2 === 0) {
evenInd += 2;
}
// Move odd pointer if element is correctly placed
while (oddInd < n && arr[oddInd] % 2 === 1) {
oddInd += 2;
}
// if both pointers are within range, then swap
if (evenInd < n && oddInd < n) {
[arr[evenInd], arr[oddInd]] = [arr[oddInd], arr[evenInd]];
} else {
break;
}
}
}
// Driver Code
let arr = [3, 6, 12, 1, 5, 8];
reArrange(arr);
console.log(arr);
Output
1
Time complexity:Â O(n)
Auxiliary Space:Â O(1)