问题描述
将n个整数存放到一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法,
将R中保存的序列循环左移p个位置,即将R中的数据又X0,X1,X2...Xn-1变换为Xp,Xp+1...Xn-1,X0,X1...Xp-1
算法的基本设计思想
可以将这个问题视为将数组ab转换为数组ba(a代表数组的前p个元素,b代表数组中余下的
n-p个元素),先将a逆置得到a-1b,再将b逆置得到a-1b-1,最后将整个数字逆置,得到b-1a-1
例如abcde,将序列左移2个位置,先将ab逆置得到bacde,再将cde逆置得到baedc,最后将整个逆置得到cdeab
使用C语言描述如下
void reverse(int R[],int start,int end){
int temp;
int mid=(start+end+1)/2;
while(left<mid){
temp=R[left];
R[left++]=R[right];
R[right--]=temp;
}
}
void converse(int R[],int size,int p){
reverse(R,0,p-1);
reverse(R,p,size-1);
reverse(R,0,size-1);
}