将m个元素放到数组尾部
这里我们的思路是将数组的前m个元素存储到另一个数组后然后再将剩余元素往前移动m位,然后再将存储的元素加到数组的尾部即可
具体代码
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include void moveelement(int *arr,int *brr,int m,int len) { int i = 0; int j = 0; int k = 0; assert(m < len); for ( i = 0; i < m; i++) { brr[i] = arr[i]; } for ( j = m; j < len; j++) { arr[j - m] = arr[j]; } for (int n = len - m; n < len; n++) { arr[n] = brr[k]; k++; } return; } int main() { int arr[] = { 1,2,3,4,5,6 }; int brr[10]; int m = 2; int len = sizeof(arr) / sizeof(arr[0]); moveelement(arr, brr, m, len); for (int w = 0; w < len; w++) { printf("% d", arr[w]); } }
将前两个元素移动到尾部
但是这个代码开辟了新的内存空间,所以这个代码的空间复杂度又比较大,因此我们需要进行优化
我们可以采取另外一种思路
关于时间复杂度和空间复杂度
算法的时间复杂度与空间复杂度_iccoke的博客-CSDN博客
将整个数组扭转,再根据要求再扭转
例如
将 1,2,3,4,5,6的前2位移动到尾部
先全部扭转,结果为
6,5,4,3,2,1
再分别扭转前四个和后两个即可
扭转前四个结果为
3,4,5,6,2,1
最后扭转后两位结果为
3,4,5,6,1,2
这样就以一种比较低的空间复杂度完成了我们的目的
具体代码如下
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include void Reverse(int* arr, int begin, int end) { assert(arr != NULL && end >= begin); int temp; int n = (end - begin + 1) / 2; for (int i = 0; i < n; i++,begin++,end--) { temp=arr[end]; arr[end] = arr[begin]; arr[begin] = temp; } } void moveelement(int* arr, int len, int m) { assert(arr != NULL); Reverse(arr, 0, len - 1); Reverse(arr, 0, len - m - 1); Reverse(arr, len - m, len - 1); } int main() { int arr[] = { 1,2,3,4,5,6 }; int len = sizeof(arr) / sizeof(arr[0]); moveelement(arr, len, 2); for (int i = 0; i < len ; i++) { printf("%5d", arr[i]); } return 0; }
结果如下



