//方法1,没有另创建新空间,但是效率低。
//可以看成所有元素整体性多次往后移动一步,不需要建立数组,但是效率较低。
//把数组中所有元素均向后平移m步 #include <stdio.h> #define N 10 void printArr(int* arr,int n) { int i; for(i = 0;i<n;i++) { printf("%d ",arr[i]); } } void initArr(int* arr,int n)//从1开始初始化为1,2,3,4... { int i; for(i = 0;i<n;i++) { arr[i] = i+1; } } //一定要从后往前遍历,上一元素覆盖当前元素 //如果从前往后遍历,当前元素覆盖下一元素,则需要备份,会很多麻烦。 void moveOneStep(int* arr,int n)//所有元素往后平移一步 { /*从左往右改 int i=0,j,temp; for(j=i+1;j<i+1+n-1;j++) { temp = arr[j]; arr[j] = arr[i];//把i下标上的数据移动过去 arr[i] = temp; printf("a"); } */ //从右往左改 int i; int temp = arr[n-1]; for(i = n-1;i>0;i--) { arr[i] = arr[i-1]; } arr[i] = temp; } void moveNStep(int* arr,int n,int step)//往后平移N步 { int i; step = step%n;//优化 for(i =0;i<step;i++) { moveOneStep(arr,n); } } int main(void) { int m = 6; int arr[N];//1,2,3,4,5,6,7,8,9,10 initArr(arr,N); printArr(arr,N); moveNStep(arr,N,m);//移动m步 putchar(10); printArr(arr,N); return 0; }
//方法2.每个元素移动完成再考虑下一个元素的移动,需要创建一个新数组,不然没法实现。