Given an array of 2n elements in the following format { a1, a2, a3, a4, ….., an, b1, b2, b3, b4, …., bn }. The task is shuffle the array to {a1, b1, a2, b2, a3, b3, ……, an, bn } without using extra space.
Examples:
Input : arr[] = { 1, 2, 9, 15 }
Output : 1 9 2 15
Input : arr[] = { 1, 2, 3, 4, 5, 6 }
Output : 1 4 2 5 3 6
Method 1: Brute Force
A brute force solution involves two nested loops to rotate the elements in the second half of the array to the left. The first loop runs n times to cover all elements in the second half of the array. The second loop rotates the elements to the left. Note that the start index in the second loop depends on which element we are rotating and the end index depends on how many positions we need to move to the left.
Below is the implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
void shuffleArray( int a[], int n)
{
for ( int i = 0, q = 1, k = n; i < n; i++, k++, q++)
for ( int j = k; j > i + q; j--)
swap(a[j - 1], a[j]);
}
int main()
{
int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
int n = sizeof (a) / sizeof (a[0]);
shuffleArray(a, n / 2);
for ( int i = 0; i < n; i++)
cout << a[i] << " " ;
return 0;
}
|
Java
import java.util.Arrays;
public class GFG {
static void shuffleArray( int a[], int n)
{
for ( int i = 0 , q = 1 , k = n; i < n; i++, k++, q++)
for ( int j = k; j > i + q; j--) {
int temp = a[j - 1 ];
a[j - 1 ] = a[j];
a[j] = temp;
}
}
public static void main(String[] args)
{
int a[] = { 1 , 3 , 5 , 7 , 2 , 4 , 6 , 8 };
shuffleArray(a, a.length / 2 );
System.out.println(Arrays.toString(a));
}
}
|
Python3
def shuffleArray(a, n):
i, q, k = 0 , 1 , n
while (i < n):
j = k
while (j > i + q):
a[j - 1 ], a[j] = a[j], a[j - 1 ]
j - = 1
i + = 1
k + = 1
q + = 1
a = [ 1 , 3 , 5 , 7 , 2 , 4 , 6 , 8 ]
n = len (a)
shuffleArray(a, int (n / 2 ))
for i in range ( 0 , n):
print (a[i], end = " " )
|
C#
using System;
class GFG {
static void shuffleArray( int [] a, int n)
{
for ( int i = 0, q = 1, k = n;
i < n; i++, k++, q++)
for ( int j = k; j > i + q; j--) {
int temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
public static void Main()
{
int [] a = { 1, 3, 5, 7, 2, 4, 6, 8 };
shuffleArray(a, a.Length / 2);
for ( int i = 0; i < a.Length; i++)
Console.Write(a[i] + " " );
}
}
|
Javascript
<script>
function shuffleArray(a,n)
{
for (let i = 0, q = 1, k = n; i < n; i++, k++, q++)
for (let j = k; j > i + q; j--) {
let temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
let a=[ 1, 3, 5, 7, 2, 4, 6, 8];
shuffleArray(a, a.length / 2);
document.write(a.join( " " ));
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(1)
Method 2: (Divide and Conquer):
The idea is to use Divide and Conquer Technique. Divide the given array into half (say arr1[] and arr2[]) and swap second half element of arr1[] with first half element of arr2[]. Recursively do this for arr1 and arr2.
Let us explain with the help of an example.
- Let the array be a1, a2, a3, a4, b1, b2, b3, b4
- Split the array into two halves: a1, a2, a3, a4 : b1, b2, b3, b4
- Exchange element around the center: exchange a3, a4 with b1, b2 correspondingly.
you get: a1, a2, b1, b2, a3, a4, b3, b4
- Recursively split a1, a2, b1, b2 into a1, a2 : b1, b2
then split a3, a4, b3, b4 into a3, a4 : b3, b4.
- Exchange elements around the center for each subarray we get:
a1, b1, a2, b2 and a3, b3, a4, b4.
Note: This solution only handles the case when n = 2i where i = 0, 1, 2, …etc.
Below is implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
void shufleArray( int a[], int f, int l)
{
if (f > l) {
return ;
}
if (l - f == 1)
return ;
int mid = (f + l) / 2;
int temp = mid + 1;
int mmid = (f + mid) / 2;
for ( int i = mmid + 1; i <= mid; i++)
swap(a[i], a[temp++]);
shufleArray(a, f, mid);
shufleArray(a, mid + 1, l);
}
int main()
{
int a[] = { 1, 3, 5, 7, 2, 4, 6, 8 };
int n = sizeof (a) / sizeof (a[0]);
shufleArray(a, 0, n - 1);
for ( int i = 0; i < n; i++)
cout << a[i] << " " ;
return 0;
}
|
Java
import java.util.Arrays;
public class GFG {
static void shufleArray( int a[], int f, int l)
{
if (f > l)
return ;
if (l - f == 1 )
return ;
int mid = (f + l) / 2 ;
int temp = mid + 1 ;
int mmid = (f + mid) / 2 ;
for ( int i = mmid + 1 ; i <= mid; i++) {
int temp1 = a[i];
a[i] = a[temp];
a[temp++] = temp1;
}
shufleArray(a, f, mid);
shufleArray(a, mid + 1 , l);
}
public static void main(String[] args)
{
int a[] = { 1 , 3 , 5 , 7 , 2 , 4 , 6 , 8 };
shufleArray(a, 0 , a.length - 1 );
System.out.println(Arrays.toString(a));
}
}
|
Python3
def shufleArray(a, f, l):
if (f > l):
return
if (l - f = = 1 ):
return
mid = int ((f + l) / 2 )
temp = mid + 1
mmid = int ((f + mid) / 2 )
for i in range (mmid + 1 , mid + 1 ):
(a[i], a[temp]) = (a[temp], a[i])
temp + = 1
shufleArray(a, f, mid)
shufleArray(a, mid + 1 , l)
a = [ 1 , 3 , 5 , 7 , 2 , 4 , 6 , 8 ]
n = len (a)
shufleArray(a, 0 , n - 1 )
for i in range ( 0 , n):
print (a[i], end = " " )
|
C#
using System;
public class GFG {
static void shufleArray( int [] a, int f, int l)
{
if (f > l)
return ;
if (l - f == 1)
return ;
int mid = (f + l) / 2;
int temp = mid + 1;
int mmid = (f + mid) / 2;
for ( int i = mmid + 1; i <= mid; i++) {
int temp1 = a[i];
a[i] = a[temp];
a[temp++] = temp1;
}
shufleArray(a, f, mid);
shufleArray(a, mid + 1, l);
}
public static void Main()
{
int [] a = { 1, 3, 5, 7, 2, 4, 6, 8 };
shufleArray(a, 0, a.Length - 1);
for ( int i = 0; i < a.Length; i++)
Console.Write(a[i] + " " );
}
}
|
Javascript
<script>
function shufleArray(a, f, l)
{
if (f > l)
return ;
if (l - f == 1)
return ;
let mid = Math.floor((f + l) / 2);
let temp = mid + 1;
let mmid = Math.floor((f + mid) / 2);
for (let i = mmid + 1; i <= mid; i++)
{
let temp1 = a[i];
a[i] = a[temp];
a[temp++] = temp1;
}
shufleArray(a, f, mid);
shufleArray(a, mid + 1, l);
}
let a = [ 1, 3, 5, 7, 2, 4, 6, 8 ];
shufleArray(a, 0, a.length - 1);
document.write(a.join( " " ));
</script>
|
Time Complexity: O(n log n)
Auxiliary Space: O(1)
Linear time solution
If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
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 :
03 Oct, 2022
Like Article
Save Article