实现rotate的几种算法

R
otate  123abcdefg  to    abcdefg123.   there are three ways to do this

(1)循环换位算法(2)三次反转算法
(3)排列循环置换算法:
王晓东老师在著作中介绍了一条循环置换分解定理:对于给定数组A[0..N-1]向后循环换位K位运算,可分解为恰好gcd(K,N-K)个循环置换,且0,…,gcd(K,N-K)-1中的每个数恰属于一个循环置换。其中gcd(x,y)表示x和y的最大公因数。

for(int i=0; i<gcd(k,N); ++i)
{
    int temp = a[i];
    int prev = i;
    for(int j=(i+k)%N; j != i; j = (j+k)%N)
    {
        a[prev] = a[j];
        prev = j;
    }
    a[prev] = temp;
}
点赞