试设计一个算法,将数组A中的元素A[0..n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。
一维数组类型Array1D的定义:
一维数组类型Array1D的定义:
typedef ElemType Array1D[MAXLEN];
实现函数如下:
void Rotate(Array1D &a, int n, int k)
/* a[n] contains the elements, */
/* rotate them right circlely by k sits */
{
int i,j;
ElemType temp;
if(k%n != 0){//k不是n的倍数时执行,k是n的倍数时数组中的元素位置不变
for(i = 0; i < k; ++i){//执行k次以下的操作,即向右移动了k位
temp = a[n -1];
for(j = n - 2; j >= 0; j--){
a[j + 1] = a[j];//将数组中的元素向右移一位
}
a[0] = temp;//将原来的数组末尾的元素移到数组的第一位
}
}
}