【2010统考真题】设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面都尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(X0,X1…Xn-1)变换为(Xp,Xp+1…Xn-1,X0,…Xp-1)。要求:
1)给出算法的基本设计思想。
2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
3)说明你所设计算法的时间复杂度和空间复杂度。
算法思路:主要的思路和2.2.8差不多都是先分段逆置再整体逆置的办法实现。
代码不是很难的,主要是这个算法思路要熟练。
void Reverse(DataType R[], int left, int right, int arraySize) { //逆置函数,本题是数组所以要用到起始位置left和终止位置right
int t; //利用中间变量
int i;
//要记得考虑算法的健壮性啊!!!总是忘!
if (left >= right || right >= arraySize) {
return; //void类型的函数里就直接return;(return 0;和return;的区别在于返回的类型)
}
for (i = 0; i <= (left + right) / 2; i++) {
t = R[left + i];
R[left + i] = R[right - i];
R[right - i] = t;
}
}
void LeftMove(DataTYpe R[],int n, int p, int arraySize) {
Reverse(R, 0, p - 1, arraySize);
Reverse(R, p, n - 1, arraySize);
Reverse(R, 0, n - 1, arraySize);
}