Given an array A[], write a function that segregates even and odd numbers. The functions should put all even numbers first, and then odd numbers.
Example:
Input = {12, 34, 45, 9, 8, 90, 3}
Output = {12, 34, 8, 90, 45, 9, 3}
In the output, the order of numbers can be changed, i.e., in the above example, 34 can come before 12 and 3 can come before 9.
The problem is very similar to our old post Segregate 0s and 1s in an array, and both of these problems are variation of famous Dutch national flag problem.
Algorithm: segregateEvenOdd()
1) Initialize two index variables left and right:
left = 0, right = size -1
2) Keep incrementing left index until we see an even number.
3) Keep decrementing right index until we see an odd number.
4) If left < right then swap arr[left] and arr[right]
Implementation:
C++
#include <iostream>
using namespace std;
void swap( int *a, int *b);
void segregateEvenOdd( int arr[], int size)
{
int left = 0, right = size-1;
while (left < right)
{
while (arr[left] % 2 == 0 && left < right)
left++;
while (arr[right] % 2 == 1 && left < right)
right--;
if (left < right)
{
swap(&arr[left], &arr[right]);
left++;
right--;
}
}
}
void swap( int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int arr[] = {12, 34, 45, 9, 8, 90, 3};
int arr_size = sizeof (arr)/ sizeof (arr[0]);
int i = 0;
segregateEvenOdd(arr, arr_size);
cout << "Array after segregation " ;
for (i = 0; i < arr_size; i++)
cout << arr[i] << " " ;
return 0;
}
|
C
#include<stdio.h>
void swap( int *a, int *b);
void segregateEvenOdd( int arr[], int size)
{
int left = 0, right = size-1;
while (left < right)
{
while (arr[left]%2 == 0 && left < right)
left++;
while (arr[right]%2 == 1 && left < right)
right--;
if (left < right)
{
swap(&arr[left], &arr[right]);
left++;
right--;
}
}
}
void swap( int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int arr[] = {12, 34, 45, 9, 8, 90, 3};
int arr_size = sizeof (arr)/ sizeof (arr[0]);
int i = 0;
segregateEvenOdd(arr, arr_size);
printf ( "Array after segregation " );
for (i = 0; i < arr_size; i++)
printf ( "%d " , arr[i]);
return 0;
}
|
Java
import java.io.*;
class SegregateOddEven
{
static void segregateEvenOdd( int arr[])
{
int left = 0 , right = arr.length - 1 ;
while (left < right)
{
while (arr[left]% 2 == 0 && left < right)
left++;
while (arr[right]% 2 == 1 && left < right)
right--;
if (left < right)
{
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
public static void main (String[] args)
{
int arr[] = { 12 , 34 , 45 , 9 , 8 , 90 , 3 };
segregateEvenOdd(arr);
System.out.print( "Array after segregation " );
for ( int i = 0 ; i < arr.length; i++)
System.out.print(arr[i]+ " " );
}
}
|
Python
def segregateEvenOdd(arr):
left,right = 0 , len (arr) - 1
while left < right:
while (arr[left] % 2 = = 0 and left < right):
left + = 1
while (arr[right] % 2 = = 1 and left < right):
right - = 1
if (left < right):
arr[left],arr[right] = arr[right],arr[left]
left + = 1
right = right - 1
arr = [ 12 , 34 , 45 , 9 , 8 , 90 , 3 ]
segregateEvenOdd(arr)
print ( "Array after segregation " ),
for i in range ( 0 , len (arr)):
print arr[i],
|
C#
using System;
class GFG
{
static void segregateEvenOdd( int []arr)
{
int left = 0, right = arr.Length - 1;
while (left < right)
{
while (arr[left]%2 == 0 && left < right)
left++;
while (arr[right]%2 == 1 && left < right)
right--;
if (left < right)
{
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
public static void Main ()
{
int []arr = {12, 34, 45, 9, 8, 90, 3};
segregateEvenOdd(arr);
Console.Write( "Array after segregation " );
for ( int i = 0; i < arr.Length; i++)
Console.Write(arr[i]+ " " );
}
}
|
PHP
<?php
function segregateEvenOdd(& $arr , $size )
{
$left = 0;
$right = $size -1;
while ( $left < $right )
{
while ( $arr [ $left ] % 2 == 0 &&
$left < $right )
$left ++;
while ( $arr [ $right ] % 2 == 1 &&
$left < $right )
$right --;
if ( $left < $right )
{
swap( $arr [ $left ], $arr [ $right ]);
$left ++;
$right --;
}
}
}
function swap(& $a , & $b )
{
$temp = $a ;
$a = $b ;
$b = $temp ;
}
$arr = array (12, 34, 45, 9, 8, 90, 3);
$arr_size = count ( $arr );
segregateEvenOdd( $arr , $arr_size );
echo "Array after segregation " ;
for ( $i = 0; $i < $arr_size ; $i ++)
echo $arr [ $i ]. " " ;
?>
|
Javascript
<script>
function segregateEvenOdd(arr)
{
var left = 0, right = arr.length - 1;
while (left < right)
{
while (arr[left]%2 == 0 && left < right)
left++;
while (arr[right]%2 == 1 && left < right)
right--;
if (left < right)
{
var temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
var arr = [12, 34, 45, 9, 8, 90, 3];
segregateEvenOdd(arr);
document.write( "Array after segregation " );
for (i = 0; i < arr.length; i++)
document.write(arr[i]+ " " );
</script>
|
Output
Array after segregation 12 34 90 8 9 45 3
Time Complexity: O(n)
Auxiliary Space: O(1)
Alternate Implementation (Lomuto partition):
C++
#include <iostream>
using namespace std;
void rearrangeEvenAndOdd( int arr[], int n)
{
int j = -1;
for ( int i = 0; i < n; i++) {
if (arr[i] % 2 == 0) {
j++;
swap(arr[i], arr[j]);
}
}
}
int main()
{
int arr[] = { 12, 10, 9, 45, 2, 10, 10, 45 };
int n = sizeof (arr) / sizeof (arr[0]);
rearrangeEvenAndOdd(arr, n);
for ( int i = 0; i < n; i++)
cout << arr[i] << " " ;
}
|
Java
import java.io.*;
class GFG
{
static void rearrangeEvenAndOdd( int arr[], int n)
{
int j = - 1 ,temp;
for ( int i = 0 ; i < n; i++) {
if (arr[i] % 2 == 0 ) {
j++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
public static void main(String args[])
{
int arr[] = { 12 , 10 , 9 , 45 , 2 , 10 , 10 , 45 };
int n = arr.length;
rearrangeEvenAndOdd(arr, n);
for ( int i = 0 ; i < n; i++)
System.out.print(arr[i] + " " );
}
}
|
Python3
def rearrangeEvenAndOdd(arr, n) :
j = - 1
for i in range ( 0 , n) :
if (arr[i] % 2 = = 0 ) :
j = j + 1
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
arr = [ 12 , 10 , 9 , 45 , 2 , 10 , 10 , 45 ]
n = len (arr)
rearrangeEvenAndOdd(arr, n)
for i in range ( 0 ,n) :
print ( arr[i] ,end = " " )
|
C#
using System;
class GFG
{
static void rearrangeEvenAndOdd( int []arr,
int n)
{
int j = -1, temp;
for ( int i = 0; i < n; i++) {
if (arr[i] % 2 == 0) {
j++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
public static void Main()
{
int []arr = { 12, 10, 9, 45, 2,
10, 10, 45 };
int n = arr.Length;
rearrangeEvenAndOdd(arr, n);
for ( int i = 0; i < n; i++)
Console.Write(arr[i] + " " );
}
}
|
PHP
<?php
function rearrangeEvenAndOdd(& $arr , $n )
{
$j = -1; $temp ;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $arr [ $i ] % 2 == 0)
{
$j ++;
$temp = $arr [ $i ];
$arr [ $i ] = $arr [ $j ];
$arr [ $j ] = $temp ;
}
}
}
$arr = array ( 12, 10, 9, 45, 2, 10, 10, 45 );
$n = sizeof( $arr );
rearrangeEvenAndOdd( $arr , $n );
for ( $i = 0; $i < $n ; $i ++)
echo ( $arr [ $i ] . " " );
|
Javascript
<script>
function rearrangeEvenAndOdd(arr, n)
{
var j = -1, temp;
for (i = 0; i < n; i++)
{
if (arr[i] % 2 == 0)
{
j++;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
var arr = [ 12, 10, 9, 45, 2, 10, 10, 45 ];
var n = arr.length;
rearrangeEvenAndOdd(arr, n);
for (i = 0; i < n; i++)
document.write(arr[i] + " " );
</script>
|
Output
12 10 2 10 10 45 9 45
Time Complexity: O(n)
Auxiliary Space: O(1)
Alternate Implementation (Using stable partition):
To implement the above problem, we will use stable_partition in C++. The stable_partition() algorithm arranges the sequence defined by start and end such that all elements for which the predicate specified by pfn returns true come before those for which the predicate returns false. The partitioning is stable. This means that the relative ordering of the sequence is preserved.
Syntax:
template
BiIter stable_partition(BiIter start, BiIter end, UnPred pfn);
Parameters:
start: the range of elements to reorder
end: the range of elements to reorder
pfn: User-defined predicate function object that defines
the condition to be satisfied if an element
is to be classified. A predicate takes single argument
and returns true or false.
Return Value:
Returns an iterator to the beginning of the elements
for which the predicate is false.
This function attempts to allocate a temporary buffer. If the allocation fails, the less efficient algorithm is chosen.
Below is the implementation of the above logic.
Code:
C++14
#include <bits/stdc++.h>
using namespace std;
void rearrangeEvenAndOdd(vector< int >v)
{
stable_partition(v.begin(), v.end(),
[]( auto a) { return a % 2 == 0; });
for ( int num : v)
cout << num << " " ;
}
int main()
{
vector< int > v = { 12, 10, 9, 45, 2, 10, 10, 45 };
rearrangeEvenAndOdd(v);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
public class Main {
public static void rearrangeEvenAndOdd(List<Integer> v) {
Collections.sort(v, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return Integer.compare(a % 2 , b % 2 );
}
});
for ( int num : v)
System.out.print(num + " " );
}
public static void main(String[] args) {
List<Integer> v = new ArrayList<Integer>(Arrays.asList( 12 , 10 , 9 , 45 , 2 , 10 , 10 , 45 ));
rearrangeEvenAndOdd(v);
}
}
|
Python3
import collections
def rearrangeEvenAndOdd(v):
v.sort(key = lambda x: x % 2 )
for num in v:
print (num, end = ' ' )
if __name__ = = '__main__' :
v = [ 12 , 10 , 9 , 45 , 2 , 10 , 10 , 45 ]
rearrangeEvenAndOdd(v)
|
Javascript
function rearrangeEvenAndOdd(v) {
v.sort( function (a, b) {
return a % 2 - b % 2;
});
console.log(v.join( " " ));
}
var v = [12, 10, 9, 45, 2, 10, 10, 45];
rearrangeEvenAndOdd(v);
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
public class Mainn
{
public static void rearrangeEvenAndOdd(List< int > v)
{
v.Sort((a, b) => (a % 2).CompareTo(b % 2));
foreach ( int num in v)
Console.Write(num + " " );
}
public static void Main( string [] args)
{
List< int > v = new List< int >( new int [] { 12, 10, 9, 45, 2, 10, 10, 45 });
rearrangeEvenAndOdd(v);
}
}
|
Output
12 10 2 10 10 9 45 45
Time Complexity:
If enough extra memory is available, linear in the distance between first and last i.e (O(N) ,where N is the distance between first and last). It applies predicate (i.e 3rd parameter of above code) exactly once to each element, and performs up to that many element moves.
Otherwise, performs up to N*log(N) element swaps (where N is the distance above). It also applies predicate exactly once to each element.
Auxiliary Space: O(1)
Alternate Implementation:
- Using two pointers i and j , i will point index 0 and j will point the last index.
- Run a while loop; if a[i] is odd and a[j] is even then we will swap them else we will decrement j.
Code:
C++
#include <bits/stdc++.h>
using namespace std;
void segregate( int a[], int n)
{
int i = 0, j = (n - 1);
while (j >= i) {
if (a[i] % 2 != 0)
{
if (a[j] % 2 == 0)
{
swap(a[i], a[j]);
i++;
j--;
}
else
j--;
}
else
i++;
}
for ( int i = 0; i < n; i++)
cout << a[i] << " " ;
}
int main()
{
int a[] = { 1,2,3,4,5,6 };
int n = sizeof (a) / sizeof (a[0]);
segregate(a, n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void segregate( int a[], int n)
{
int i = 0 , j = (n - 1 );
while (j >= i)
{
if (a[i] % 2 != 0 )
{
if (a[j] % 2 == 0 )
{
a = swap(a, i, j);
i++;
j--;
}
else
j--;
}
else
i++;
}
for (i = 0 ; i < n; i++)
System.out.print(a[i] + " " );
}
static int [] swap( int []arr, int i, int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static void main(String[] args)
{
int a[] = { 1 , 2 , 3 , 4 , 5 , 6 };
int n = a.length;
segregate(a, n);
}
}
|
Python3
def segregate(a, n):
i = 0
j = (n - 1 )
while (j > = i):
if (a[i] % 2 ! = 0 ):
if (a[j] % 2 = = 0 ):
a[i], a[j] = a[j], a[i]
i + = 1
j - = 1
else :
j - = 1
else :
i + = 1 ;
for i in range (n):
print (a[i], end = " " )
a = [ 1 , 2 , 3 , 4 , 5 , 6 ]
n = len (a)
segregate(a, n)
|
C#
using System;
class GFG
{
static void segregate( int [] a, int n)
{
int i = 0, j = (n - 1);
while (j >= i)
{
if (a[i] % 2 != 0) {
if (a[j] % 2 == 0) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
else
j--;
}
else
i++;
}
for (i = 0; i < n; i++)
Console.Write(a[i] + " " );
}
public static void Main( string [] args)
{
int [] a = { 1, 2, 3, 4, 5, 6 };
int n = a.Length;
segregate(a, n);
}
}
|
Javascript
import java.util.*;
class GFG{
static void segregate(int a[], int n)
{
int i = 0, j = (n - 1);
while (j >= i) {
if (a[i] % 2 != 0)
{
if (a[j] % 2 == 0)
{
a = swap(a,i,j);
i++;
j--;
}
else
j--;
}
else
i++;
}
for (i = 0; i < n; i++)
System.out.print(a[i]+ " " );
}
static int[] swap(int []arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
public static void main(String[] args)
{
int a[] = { 1,2,3,4,5,6 };
int n = a.length;
segregate(a, n);
}
}
|
PHP
<?php
function segregate( $a , $n )
{
$i = 0;
$j = ( $n - 1);
while ( $j >= $i ) {
if ( $a [ $i ] % 2 != 0)
{
if ( $a [ $j ] % 2 == 0)
{
$a = swap( $a , $i , $j );
$i ++;
$j --;
}
else
$j --;
}
else
$i ++;
}
for ( $i = 0; $i < $n ; $i ++)
echo ( $a [ $i ]. " " );
}
function swap( $arr , $i , $j ){
$temp = $arr [ $i ];
$arr [ $i ] = $arr [ $j ];
$arr [ $j ] = $temp ;
return $arr ;
}
$a [] = [ 1,2,3,4,5,6 ];
$n = sizeof( $a );
segregate( $a , $n );
?>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
References:
http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Flag/
Please write comments if you find the above code/algorithm incorrect, or find better ways to solve the same problem.
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!
Last Updated :
17 Mar, 2023
Like Article
Save Article