三步翻转法 其实也就是我们线性代数中的矩阵的反置。
具体介绍可以看这里:https://gaomf.cn/2016/11/28/Array_Shift/
主要的思想如下:
c语言代码实现:
#include<stdio.h>
//循环移动数组
//经典的三次反转实现数组循环左移K位
void swap(int *n,int *m)
{
int p;
p = *n;
*n = *m;
*m = p;
}
void reverse(int arr[],int first,int end)
{
int length = end - first + 1;
for(int i = 0; i < length / 2;i++)
{
swap(&arr[first+i],&arr[end-i]);
}
// for(i = first,j = end; i != j; i++, j--)
// {
// swap(&arr[i], &arr[j]);//这样写有问题 当i = 0 j = 1时正好下一次错过,造成指向未知空间
// }
}
int main(int argc, char const *argv[])
{
int n;
printf("please enter array size n: ");
scanf("%d",&n);
int a[n];
for (int i = 0; i < n; ++i)
{
a[i] = i;
}
int k;
printf("please enter array left step k: ");
scanf("%d",&k);
reverse(a,0,k-1);
reverse(a,k,n-1);
reverse(a,0,n-1);
for(int i = 0;i < n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
运行截图