设将n(n~1)个整数存放在一维数组 R中。试着设计一个在吋
间复杂度和空间复杂度都尽可能高效的算法,将R中保存的序列循环左移p
(0spsn)个位置,即将R中的数据由(x0x1xn1)变换为(xp
Xptle.., Xn-1,x0,X1,..,xp1)
void Reverse (int R[], int left, int right){
//将数组原地逆置
int ¡= left, j= right;
while(i<i){
int tmp=R[i];
R[i]= R[j];
R[j]=tmp;
i++; //右移动一个位置
j--; //左移一个位置
}
}
void LeftShift(int R[], int n, int p)
// 将长度为口的数组R中的数据循环左移p个位置
if(p>0 && p≤n){
Reverse(R,0,n-1);
//将数组全部逆置
Reverse(R,0,n-p-1);
//将前 n-p 个数据逆置
Reverse(R,n-p,n-1);
//将后 p个数据逆置
}
}
假设有数组:(321)(654) ,此时,n为6,p为3;
a: 0—5反转。(n-1=5);得(456)(123)
b: 0—2反转。(n-p-1=2);得(654)(123)
c: 3—5反转。 (654)(321)
n