# Reverse an array in groups of given size

Hello Everyone,

Given an array, reverse every sub-array formed by consecutive k elements.

Examples:

Input:
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
k = 3
Output:
[3, 2, 1, 6, 5, 4, 9, 8, 7]

Input:
arr = [1, 2, 3, 4, 5, 6, 7, 8]
k = 5
Output:
[5, 4, 3, 2, 1, 8, 7, 6]

Input:
arr = [1, 2, 3, 4, 5, 6]
k = 1
Output:
[1, 2, 3, 4, 5, 6]

Input:
arr = [1, 2, 3, 4, 5, 6, 7, 8]
k = 10
Output:
[8, 7, 6, 5, 4, 3, 2, 1]

Approach : Consider every sub-array of size k starting from the beginning of the array and reverse it. We need to handle some special cases. If k is not multiple of n where n is the size of the array, for the last group we will have less than k elements left, we need to reverse all remaining elements. If k = 1 , the array should remain unchanged. If k >= n, we reverse all elements present in the array.

Below is the implementation of the above approach:

`// C++ program to reverse every sub-array formed by`

`// consecutive k elements`

`#include <iostream>`

`using` `namespace` `std;`

` `

`// Function to reverse every sub-array formed by`

`// consecutive k elements`

`void` `reverse(` `int` `arr[], ` `int` `n, ` `int` `k)`

`{`

` ` `for` `(` `int` `i = 0; i < n; i += k)`

` ` `{`

` ` `int` `left = i;`

` `

` ` `// to handle case when k is not multiple of n`

` ` `int` `right = min(i + k - 1, n - 1);`

` `

` ` `// reverse the sub-array [left, right]`

` ` `while` `(left < right)`

` ` `swap(arr[left++], arr[right--]);`

` `

` ` `}`

`}`

` `

`// Driver code`

`int` `main()`

`{`

` ` `int` `arr[] = {1, 2, 3, 4, 5, 6, 7, 8};`

` ` `int` `k = 3;`

` `

` ` `int` `n = ` `sizeof` `(arr) / ` `sizeof` `(arr);`

` `

` ` `reverse(arr, n, k);`

` `

` ` `for` `(` `int` `i = 0; i < n; i++)`

` ` `cout << arr[i] << ` `" "` `;`

` `

` ` `return` `0;`

`}`

Output:

3 2 1 6 5 4 8 7

Time complexity of above solution is O(n).
Auxiliary space used by the program is O(1).