题干:设将n(n>1)个整数放进一维数组R中。试设计一个时间和空间上都高效的算法。将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据由(x0,x1,x2,…xn-1) => (xp,xp+1,xp+2,xn-1…x0,x1…xp-1)
(1)给出算法的基本设计思想;
(2)根据算法思想,采用C或者C++或者Java语言描述算法,关键之处给出注释;
(3) 说明你的算法的时间复杂度和空间复杂度。
算法解析:设数组中的(x0,x1,…,xp-1) 等于a,(xp,xp+1,…,xn-1)等于b。开始时原数列为ab,而要求的数列为ba。
(1) 先将原数列ab里面a(p个元素)倒置,得到a-1 b;(-1代表-1次方)
(2) 再将得到的数列b(n-p个元素)进行倒置,得到a-1 b-1;
(3) 最后把整个数列进行倒置,得到(a-1 b -1)-1,也就是ba
void reverse(int A[],int from,int to){
//这里from,to是数组的下标,这个函数内部需要三个参数
int i,temp;
for (i=0;i<(to-from+1)/2;i++){
//这里需要交换的元素个数是(to-from+1)/2
temp = A[from+i];
A[from+i] = A[to-i];
A[to-i] = temp;
}
void Converse(int R,int n,int p){
reverse(int R,0,p-1); //依次反转a,b以及R
reverse(int R,p,n-1);
reverse(int R,0,n-1);
}
(3)上面的时间复杂度依次是O(p/2),O(n-p/2),O(n/2)。总体的时间复杂度O(n),空间复杂度O(1).