工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1828|回复: 0

神奇的 排列循环算法

[复制链接]
发表于 2008-1-31 10:50 | 显示全部楼层 |阅读模式
看书看到一个很神奇的东西

排列循环算法

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

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

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

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

  3. {

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

  5.         T tmp=a [ i];

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

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

  8.          a[p]=tmp;

  9.          }

  10. }
复制代码



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

    换位数组块相等就简单了
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-9 16:40

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表