核心思想:
1.先将数组中的最后一个数存储在一个临时变量中;
2.将数组的前一个元素依次后移;
3.将临时变量赋值给数组的第一个元素;
代码实现:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 10
//打印数组函数
void PrintArray(int ar[], int n)
{
for (int i = 0; i < n; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
//旋转数组函数
void RightRotateArray(int ar[], int n, int k)
{
for (int i = 0; i < k; ++i)
{
int temp = ar[n - 1];//先保存最后一个数
for (int j = n - 1; j > 0; --j)
{
ar[j] = ar[j - 1];//移动数据
}
ar[0] = temp;
}
}
//主函数
int main()
{
int ar[N];
srand(time(0));
for (int i = 0; i < N; ++i)
{
ar[i] = rand() % 100 + 1;
}
PrintArray(ar, N);
RightRotateArray(ar, N, 2);
PrintArray(ar, N);
}
上述函数中:只适合数组内元素较少,旋转次数较少的要求,在编程中效率不是很高;
如何改进呢?
进行取模操作:
k%=n;
但是通过上述方法在改进后,仍然不符合时间要求,这时就需要转换思路重新进行分析:
首先分析上述代码为什么所需时间较长,是因为在执行过程中一直在移动数据,所以,我们从数据的移动中思考:
第一步:将数组整体进行转置;
第二步:找出旋转的分界线(旋转的次数),然后各自进行转置;
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define N 10
//打印数组
void PrintArray(int ar[], int n)
{
for (int i = 0; i < n; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
//数组逆置:
void ReverseArray(int ar[], int n)
{
int left = 0;
int right = n - 1;
while (left < right)
{
int temp = ar[left];
ar[left] = ar[right];
ar[right] = temp;
left++;
right--;
}
}
//旋转数组2.0
void RightRotateArray(int* nums, int numsSize, int k)
{
k %= numsSize;
ReverseArray(nums, numsSize);
ReverseArray(nums, k);
ReverseArray(nums + k, numsSize - k);
}
//主函数:
int main()
{
int ar[N];
srand(time(0));
for (int i = 0; i < N; ++i)
{
ar[i] = rand() % 100 + 1;
}
PrintArray(ar, N);
RightRotateArray(ar, N, 3);
PrintArray(ar, N);
}