共计 437 个字符,预计需要花费 2 分钟才能阅读完成。
数组的循环右移 K 位算法,仅使用一个附加的空间,交换次数或元素移动时间复杂度为 O(n);
/* 步骤分为三步:(K=2)
1. 将第 1 位至第 N-K 位进行反转;1,2,3, 4,5->3,2,1, 4,5
2. 将第 N-K+1 位至第 N 位进行反转;3,2,1, 4,5->3,2,1, 5,4
3. 将整个第 1 位至第 N 位进行反转;3,2,1,5,4->4,5,1,2,3
最终即可实现 循环右移 K 位的算法;*/
void Reverse(int start, int end, int* B)// 逆置函数
{
int i = start, j = end, temp = 0;// 附加空间
while (i < j)
{temp = B[i];
B[i] = B[j];
B[j] = temp;
j--;
i++;
}
}
void Exchange(int Num,int k,int* B)// 生成函数
{
k=k%Num;
Reverse(0, Num - k - 1, B);// 注意传参时一维数组下标由 0 开始
Reverse(Num-k, Num-1, B);
Reverse(0, Num - 1, B);
}
正文完