Reversal algorithm for array rotation
The Reversal algorithm for array rotation is a simple and efficient algorithm used to rotate an array of integers by a given number of positions.
The algorithm works by reversing the order of the first d
elements of the array, where d
is the number of positions to rotate. It then reverses the order of the remaining elements of the array. Finally, it reverses the entire array to obtain the rotated array.
Here is the pseudocode for the Reversal algorithm for array rotation:
reverse(arr, start, end):
while start < end:
arr[start], arr[end] = arr[end], arr[start]
start += 1
end -= 1
rotateArray(arr, d):
n = len(arr)
reverse(arr, 0, d-1)
reverse(arr, d, n-1)
reverse(arr, 0, n-1)
In this algorithm, reverse()
is a function that reverses the order of the elements in the given subarray arr[start:end]
, where start
is the starting index and end
is the ending index.
rotateArray()
is the main function that rotates the array arr
by d
positions. It first computes the length of the array n
, then calls reverse()
on the first d
elements, the next n-d
elements, and finally the entire array.
The time complexity of the Reversal algorithm for array rotation is O(n), where n is the size of the input array. This algorithm is more efficient than other rotation algorithms that involve shifting elements, especially when the number of positions to rotate is large.
Here given code implementation process.
// C program for
// Reversal algorithm for array rotation
#include <stdio.h>
// This is display the given array elements
void printData(int arr[], int n)
{
// Executing the loop through by the size of array
for (int i = 0; i < n; ++i)
{
printf(" %d", arr[i]);
}
printf("\n");
}
// Reverse the array elements from s to e
void reverse(int arr[], int s, int e)
{
int i = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i++;
}
}
void rotateElement(int arr[], int n, int k)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
reverse(arr, 0, k - 1);
// reverse right block [k..n]
reverse(arr, k, n);
// reverse full array [0..n]
reverse(arr, 0, n);
}
// Handles the request of rotate array by k
void rotateArray(int arr[], int n, int k)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
printf("\n Before rotate ");
printf("\n Array : ");
printData(arr, n);
printf(" Given rotation k is : %d", k);
// rotate the element
rotateElement(arr, n - 1, k % n);
// Display resultant array
printf("\n After rotate ");
printf("\n Array : ");
printData(arr, n);
}
int main(int argc, char
const *argv[])
{
// Array of integer elements
int arr[] = {
8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
};
// Get the number of elements
int n = sizeof(arr) / sizeof(arr[0]);
// Test case
rotateArray(arr, n, 5);
rotateArray(arr, n, 3);
return 0;
}
input
Before rotate
Array : 8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array : 3 2 1 0 8 7 6 5 4
Before rotate
Array : 3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array : 0 8 7 6 5 4 3 2 1
/*
Java Program for
Reversal algorithm for array rotation
*/
public class Rotation
{
// This is display the given array elements
public void printData(int[] arr, int n)
{
// Executing the loop through by the size of array
for (int i = 0; i < n; ++i)
{
System.out.print(" " + arr[i]);
}
System.out.print("\n");
}
// Reverse the array elements from s to e
public void reverse(int[] arr, int s, int e)
{
int i = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i++;
}
}
public void rotateElement(int[] arr, int n, int k)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
reverse(arr, 0, k - 1);
// reverse right block [k..n]
reverse(arr, k, n);
// reverse full array [0..n]
reverse(arr, 0, n);
}
// Handles the request of rotate array by k
public void rotateArray(int[] arr, int n, int k)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
System.out.println(" Before rotate ");
System.out.println(" Array : ");
printData(arr, n);
System.out.println(" Given rotation k is : " + k);
// rotate the element
rotateElement(arr, n - 1, k % n);
// Display resultant array
System.out.println(" After rotate ");
System.out.println(" Array : ");
printData(arr, n);
System.out.print("\n");
}
public static void main(String[] args)
{
Rotation task = new Rotation();
// Array of integer elements
int[] arr = {
8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
};
// Get the number of elements
int n = arr.length;
// Test case
task.rotateArray(arr, n, 5);
task.rotateArray(arr, n, 3);
}
}
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
// Include header file
#include <iostream>
using namespace std;
/*
C++ Program for
Reversal algorithm for array rotation
*/
class Rotation
{
public:
// This is display the given array elements
void printData(int arr[], int n)
{
// Executing the loop through by the size of array
for (int i = 0; i < n; ++i)
{
cout << " " << arr[i];
}
cout << "\n";
}
// Reverse the array elements from s to e
void reverse(int arr[], int s, int e)
{
int i = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i++;
}
}
void rotateElement(int arr[], int n, int k)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
this->reverse(arr, 0, k - 1);
// reverse right block [k..n]
this->reverse(arr, k, n);
// reverse full array [0..n]
this->reverse(arr, 0, n);
}
// Handles the request of rotate array by k
void rotateArray(int arr[], int n, int k)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
cout << " Before rotate " << endl;
cout << " Array : " << endl;
this->printData(arr, n);
cout << " Given rotation k is : " << k << endl;
// rotate the element
this->rotateElement(arr, n - 1, k % n);
// Display resultant array
cout << " After rotate " << endl;
cout << " Array : " << endl;
this->printData(arr, n);
cout << "\n";
}
};
int main()
{
Rotation *task = new Rotation();
// Array of integer elements
int arr[] = {
8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
};
// Get the number of elements
int n = sizeof(arr) / sizeof(arr[0]);
// Test case
task->rotateArray(arr, n, 5);
task->rotateArray(arr, n, 3);
return 0;
}
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
// Include namespace system
using System;
/*
Csharp Program for
Reversal algorithm for array rotation
*/
public class Rotation
{
// This is display the given array elements
public void printData(int[] arr, int n)
{
// Executing the loop through by the size of array
for (int i = 0; i < n; ++i)
{
Console.Write(" " + arr[i]);
}
Console.Write("\n");
}
// Reverse the array elements from s to e
public void reverse(int[] arr, int s, int e)
{
int i = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i++;
}
}
public void rotateElement(int[] arr, int n, int k)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
this.reverse(arr, 0, k - 1);
// reverse right block [k..n]
this.reverse(arr, k, n);
// reverse full array [0..n]
this.reverse(arr, 0, n);
}
// Handles the request of rotate array by k
public void rotateArray(int[] arr, int n, int k)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
Console.WriteLine(" Before rotate ");
Console.WriteLine(" Array : ");
this.printData(arr, n);
Console.WriteLine(" Given rotation k is : " + k);
// rotate the element
this.rotateElement(arr, n - 1, k % n);
// Display resultant array
Console.WriteLine(" After rotate ");
Console.WriteLine(" Array : ");
this.printData(arr, n);
Console.Write("\n");
}
public static void Main(String[] args)
{
Rotation task = new Rotation();
// Array of integer elements
int[] arr = {
8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
};
// Get the number of elements
int n = arr.Length;
// Test case
task.rotateArray(arr, n, 5);
task.rotateArray(arr, n, 3);
}
}
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
<?php
/*
Php Program for
Reversal algorithm for array rotation
*/
class Rotation
{
// This is display the given array elements
public function printData($arr, $n)
{
// Executing the loop through by the size of array
for ($i = 0; $i < $n; ++$i)
{
echo(" ".$arr[$i]);
}
echo("\n");
}
// Reverse the array elements from s to e
public function reverse(&$arr, $s, $e)
{
$i = 0;
while ($i + $s < $e - $i)
{
// Swap element
$arr[$s + $i] = $arr[$s + $i] + $arr[$e - $i];
$arr[$e - $i] = $arr[$s + $i] - $arr[$e - $i];
$arr[$s + $i] = $arr[$s + $i] - $arr[$e - $i];
// change location
$i++;
}
}
public function rotateElement(&$arr, $n, $k)
{
if ($k == 0)
{
return;
}
// reverse left block [0..k-1]
$this->reverse($arr, 0, $k - 1);
// reverse right block [k..n]
$this->reverse($arr, $k, $n);
// reverse full array [0..n]
$this->reverse($arr, 0, $n);
}
// Handles the request of rotate array by k
public function rotateArray(&$arr, $n, $k)
{
if ($k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
echo(" Before rotate \n");
echo(" Array : \n");
$this->printData($arr, $n);
echo(" Given rotation k is : ".$k.
"\n");
// rotate the element
$this->rotateElement($arr, $n - 1, $k % $n);
// Display resultant array
echo(" After rotate \n");
echo(" Array : \n");
$this->printData($arr, $n);
echo("\n");
}
}
function main()
{
$task = new Rotation();
// Array of integer elements
$arr = array(8, 7, 6, 5, 4, 3, 2, 1, 0);
// Get the number of elements
$n = count($arr);
// Test case
$task->rotateArray($arr, $n, 5);
$task->rotateArray($arr, $n, 3);
}
main();
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
/*
Node JS Program for
Reversal algorithm for array rotation
*/
class Rotation
{
// This is display the given array elements
printData(arr, n)
{
// Executing the loop through by the size of array
for (var i = 0; i < n; ++i)
{
process.stdout.write(" " + arr[i]);
}
process.stdout.write("\n");
}
// Reverse the array elements from s to e
reverse(arr, s, e)
{
var i = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i++;
}
}
rotateElement(arr, n, k)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
this.reverse(arr, 0, k - 1);
// reverse right block [k..n]
this.reverse(arr, k, n);
// reverse full array [0..n]
this.reverse(arr, 0, n);
}
// Handles the request of rotate array by k
rotateArray(arr, n, k)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
console.log(" Before rotate ");
console.log(" Array : ");
this.printData(arr, n);
console.log(" Given rotation k is : " + k);
// rotate the element
this.rotateElement(arr, n - 1, k % n);
// Display resultant array
console.log(" After rotate ");
console.log(" Array : ");
this.printData(arr, n);
process.stdout.write("\n");
}
}
function main()
{
var task = new Rotation();
// Array of integer elements
var arr = [8, 7, 6, 5, 4, 3, 2, 1, 0];
// Get the number of elements
var n = arr.length;
// Test case
task.rotateArray(arr, n, 5);
task.rotateArray(arr, n, 3);
}
main();
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
# Python 3 Program for
# Reversal algorithm for array rotation
class Rotation :
# This is display the given list elements
def printData(self, arr, n) :
# Executing the loop through by the size of list
i = 0
while (i < n) :
print(" ", arr[i], end = "")
i += 1
print(end = "\n")
# Reverse the list elements from s to e
def reverse(self, arr, s, e) :
i = 0
while (i + s < e - i) :
# Swap element
arr[s + i] = arr[s + i] + arr[e - i]
arr[e - i] = arr[s + i] - arr[e - i]
arr[s + i] = arr[s + i] - arr[e - i]
# change location
i += 1
def rotateElement(self, arr, n, k) :
if (k == 0) :
return
# reverse left block [0..k-1]
self.reverse(arr, 0, k - 1)
# reverse right block [k..n]
self.reverse(arr, k, n)
# reverse full list [0..n]
self.reverse(arr, 0, n)
# Handles the request of rotate list by k
def rotateArray(self, arr, n, k) :
if (k <= 0) :
# When k less than or equal to zero
return
# Display given list
print(" Before rotate ")
print(" Array : ")
self.printData(arr, n)
print(" Given rotation k is : ", k)
# rotate the element
self.rotateElement(arr, n - 1, k % n)
# Display resultant list
print(" After rotate ")
print(" Array : ")
self.printData(arr, n)
print(end = "\n")
def main() :
task = Rotation()
arr = [8, 7, 6, 5, 4, 3, 2, 1, 0]
n = len(arr)
# Test case
task.rotateArray(arr, n, 5)
task.rotateArray(arr, n, 3)
if __name__ == "__main__": main()
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
# Ruby Program for
# Reversal algorithm for array rotation
class Rotation
# This is display the given array elements
def printData(arr, n)
# Executing the loop through by the size of array
i = 0
while (i < n)
print(" ", arr[i])
i += 1
end
print("\n")
end
# Reverse the array elements from s to e
def reverse(arr, s, e)
i = 0
while (i + s < e - i)
# Swap element
arr[s + i] = arr[s + i] + arr[e - i]
arr[e - i] = arr[s + i] - arr[e - i]
arr[s + i] = arr[s + i] - arr[e - i]
# change location
i += 1
end
end
def rotateElement(arr, n, k)
if (k == 0)
return
end
# reverse left block [0..k-1]
self.reverse(arr, 0, k - 1)
# reverse right block [k..n]
self.reverse(arr, k, n)
# reverse full array [0..n]
self.reverse(arr, 0, n)
end
# Handles the request of rotate array by k
def rotateArray(arr, n, k)
if (k <= 0)
# When k less than or equal to zero
return
end
# Display given array
print(" Before rotate ", "\n")
print(" Array : ", "\n")
self.printData(arr, n)
print(" Given rotation k is : ", k, "\n")
# rotate the element
self.rotateElement(arr, n - 1, k % n)
# Display resultant array
print(" After rotate ", "\n")
print(" Array : ", "\n")
self.printData(arr, n)
print("\n")
end
end
def main()
task = Rotation.new()
# Array of integer elements
arr = [8, 7, 6, 5, 4, 3, 2, 1, 0]
# Get the number of elements
n = arr.length
# Test case
task.rotateArray(arr, n, 5)
task.rotateArray(arr, n, 3)
end
main()
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
/*
Scala Program for
Reversal algorithm for array rotation
*/
class Rotation()
{
// This is display the given array elements
def printData(arr: Array[Int], n: Int): Unit = {
// Executing the loop through by the size of array
var i: Int = 0;
while (i < n)
{
print(" " + arr(i));
i += 1;
}
print("\n");
}
// Reverse the array elements from s to e
def reverse(arr: Array[Int], s: Int, e: Int): Unit = {
var i: Int = 0;
while (i + s < e - i)
{
// Swap element
arr(s + i) = arr(s + i) + arr(e - i);
arr(e - i) = arr(s + i) - arr(e - i);
arr(s + i) = arr(s + i) - arr(e - i);
// change location
i += 1;
}
}
def rotateElement(arr: Array[Int], n: Int, k: Int): Unit = {
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
reverse(arr, 0, k - 1);
// reverse right block [k..n]
reverse(arr, k, n);
// reverse full array [0..n]
reverse(arr, 0, n);
}
// Handles the request of rotate array by k
def rotateArray(arr: Array[Int], n: Int, k: Int): Unit = {
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
println(" Before rotate ");
println(" Array : ");
printData(arr, n);
println(" Given rotation k is : " + k);
// rotate the element
rotateElement(arr, n - 1, k % n);
// Display resultant array
println(" After rotate ");
println(" Array : ");
printData(arr, n);
print("\n");
}
}
object Main
{
def main(args: Array[String]): Unit = {
var task: Rotation = new Rotation();
// Array of integer elements
var arr: Array[Int] = Array(8, 7, 6, 5, 4, 3, 2, 1, 0);
// Get the number of elements
var n: Int = arr.length;
// Test case
task.rotateArray(arr, n, 5);
task.rotateArray(arr, n, 3);
}
}
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
/*
Swift 4 Program for
Reversal algorithm for array rotation
*/
class Rotation
{
// This is display the given array elements
func printData(_ arr: [Int], _ n: Int)
{
// Executing the loop through by the size of array
var i: Int = 0;
while (i < n)
{
print(" ", arr[i], terminator: "");
i += 1;
}
print(terminator: "\n");
}
// Reverse the array elements from s to e
func reverse(_ arr: inout[Int], _ s: Int, _ e: Int)
{
var i: Int = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i += 1;
}
}
func rotateElement(_ arr: inout[Int], _ n: Int, _ k: Int)
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
self.reverse(&arr, 0, k - 1);
// reverse right block [k..n]
self.reverse(&arr, k, n);
// reverse full array [0..n]
self.reverse(&arr, 0, n);
}
// Handles the request of rotate array by k
func rotateArray(_ arr: inout[Int], _ n: Int, _ k: Int)
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
print(" Before rotate ");
print(" Array : ");
self.printData(arr, n);
print(" Given rotation k is : ", k);
// rotate the element
self.rotateElement(&arr, n - 1, k % n);
// Display resultant array
print(" After rotate ");
print(" Array : ");
self.printData(arr, n);
print(terminator: "\n");
}
}
func main()
{
let task: Rotation = Rotation();
// Array of integer elements
var arr: [Int] = [8, 7, 6, 5, 4, 3, 2, 1, 0];
// Get the number of elements
let n: Int = arr.count;
// Test case
task.rotateArray(&arr, n, 5);
task.rotateArray(&arr, n, 3);
}
main();
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
/*
Kotlin Program for
Reversal algorithm for array rotation
*/
class Rotation
{
// This is display the given array elements
fun printData(arr: Array < Int > , n: Int): Unit
{
var i: Int = 0;
while (i < n)
{
print(" " + arr[i].toString());
i += 1;
}
print("\n");
}
// Reverse the array elements from s to e
fun reverse(arr: Array < Int > , s: Int, e: Int): Unit
{
var i: Int = 0;
while (i + s < e - i)
{
// Swap element
arr[s + i] = arr[s + i] + arr[e - i];
arr[e - i] = arr[s + i] - arr[e - i];
arr[s + i] = arr[s + i] - arr[e - i];
// change location
i += 1;
}
}
fun rotateElement(arr: Array < Int > , n: Int, k: Int): Unit
{
if (k == 0)
{
return;
}
// reverse left block [0..k-1]
this.reverse(arr, 0, k - 1);
// reverse right block [k..n]
this.reverse(arr, k, n);
// reverse full array [0..n]
this.reverse(arr, 0, n);
}
// Handles the request of rotate array by k
fun rotateArray(arr: Array < Int > , n: Int, k: Int): Unit
{
if (k <= 0)
{
// When k less than or equal to zero
return;
}
// Display given array
println(" Before rotate ");
println(" Array : ");
this.printData(arr, n);
println(" Given rotation k is : " + k.toString());
// rotate the element
this.rotateElement(arr, n - 1, k % n);
// Display resultant array
println(" After rotate ");
println(" Array : ");
this.printData(arr, n);
print("\n");
}
}
fun main(args: Array < String > ): Unit
{
val task: Rotation = Rotation();
// Array of integer elements
val arr: Array < Int > = arrayOf(8, 7, 6, 5, 4, 3, 2, 1, 0);
// Get the number of elements
val n: Int = arr.count();
// Test case
task.rotateArray(arr, n, 5);
task.rotateArray(arr, n, 3);
}
input
Before rotate
Array :
8 7 6 5 4 3 2 1 0
Given rotation k is : 5
After rotate
Array :
3 2 1 0 8 7 6 5 4
Before rotate
Array :
3 2 1 0 8 7 6 5 4
Given rotation k is : 3
After rotate
Array :
0 8 7 6 5 4 3 2 1
Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.
New Comment