[M-10]
Write a function that rotates an integer array right by N positions.
If N is negative, rotate N positions left. If N
is greater than the size of the array, change N to N%size.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Rotated Right by 10: 20 21 22 23 24 25 26 27 28 29 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
The easy version — repeatedly rotating right N times — is not efficient. But
the other ways of doing this are hard. Write the easy version first so that
you can test your efficient version [H-15]against it.
Here is a testing framework (which may not work on all systems because of local array variable x.)
#include <stdio.h>
#include <stdlib.h>
void rotateRightArray( int size, int arr[] );
/* Puzzle C39 -- rotate every array element N positions right */
void rotateRightNArray( int size, int arr[], int N )
{
}
void rotateRightArray( int size, int arr[] )
{
int j;
int lastElt;
lastElt = arr[size-1];
for ( j=size-1; j>=1; j-- )
arr[j] = arr[j-1];
arr[0] = lastElt;
}
void fillArrayInOrder( int size, int arr[] )
{
int j;
for ( j=0; j<size; j++ )
{
arr[j] = j;
}
}
void printArray( int size, int arr[] )
{
const int N = 10;
int j;
for ( j=0; j<size; j++ )
{
if ( j%N == N-1 )
printf("%4d\n", arr[j] );
else
printf("%4d ", arr[j] );
}
}
int main()
{
int size, shift;
/* Gather parameters from user */
printf("Size of Array: ");
scanf("%d", &size);
printf("Amount to rotate: ");
scanf("%d", &shift);
/* Create the array (may not work on your system ) */
int x[ size ];
fillArrayInOrder( size, x );
printf("Original:\n");
printArray( size, x );
/* Shift right and print */
rotateRightNArray( size, x, shift );
printf("\nRotated Right by %d (version 1): \n", shift);
printArray( size, x );
return 0;
}