数组右移问题
一个数组A中存有N(N>0)个整数,在不允许使用其它数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?我的思想是:先把数组后m个数和前m个数先交换,然后用递归
但是总是在 n-m < m 的时候用递归时有问题,怎样修改
程序代码:
#include <iostream> using namespace std; const int MaxSize = 100; void swap(int &a, int &b) { a ^= b; b ^= a; a ^= b; } /* n : 对n个数进行处理 m : 要改变位置的m个数 len : a[]的使用长度 */ void reserve(int a[],int start, int n, int m,const int len) { cout << start <<endl; if (start + ((n-m > m)?m:(n-m))== len || n==m)//这里可能有问题 { return ; } int i = start; if (m < n-m) { for (; i < start + m; i++) { cout << a[i] << " < " << a[n-m+i] << endl; swap(a[i], a[n-m+i]);//交换前m个后m个数 } reserve(a, start+m, n-m, m,len); } else if (m == n-m) { for (; i < m; i++) { cout << a[i] << " = " << a[m+i] << endl; swap(a[i], a[m+i]);//要处理的前m个数和后m个数正好是整个数组的元素 } } else { for (; i < start + n - m; i++) { cout << a[i] << " > " << a[n-m+i] << endl; swap(a[i], a[n-m+i]);//交换前m个后m个数 } reserve(a, start+n-m, m, m, len);//这里可能有问题 } } int main() { int n, m; int a[MaxSize]; int i = 0; cin >> n >> m; for (; i < n; i++) { cin >> a[i]; } m = m % n; if (m != n) reserve(a, 0, n, m,n); for (i = 0; i < n-1; i++) { cout << a[i] << " "; } cout << a[i] << endl; return 0; }