落雨晴天 发表于 2008-1-31 10:50

神奇的 排列循环算法

看书看到一个很神奇的东西

排列循环算法

向后循环换位算法执行数组元素的一个重新排列
因此向后循环换位对应于n个元素的一个置换

循环置换分解定理:对于给定数组a向后循环换位n-k位运算,可分解为恰好gcd(k,n-k)个循环置换,且0,。。,gcd(k,n-k)-1中每个数恰好属于一个循环置换。其中gcd(x,n-k)表示整数x和y的最大公约数

数组块换位算法:
template <class T>

void exch(T a[],int n,int k)

{

   for(int i=0,cyc=gcd(k,n-k);i<cyc;i++){

      T tmp=a [ i];

      int p=i,j=(k+i)%n;

      while(j!=i){ a=a[ j]; p=j; j=(k+p)%n;}

         a=tmp;

         }

}


移动元素次数n+gcd(k,n-k)次

    换位数组块相等就简单了
页: [1]
查看完整版本: 神奇的 排列循环算法