Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520970
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2007-10-08 13:45:00

长度为n的数组,将其元素循环左移(右移)t位
(1)最朴素的想法:每次循环左移1位,移t次
 

static void onestep(int *s,int n); /*循环左移1位*/
void rsh(int *s,int n,int t); /*循环左移t位*/

void
rsh(int *s,int n,int t){
   for(;t>0;t--)
       onestep(s,n);
}

static void
onestep(int *s,int n){
   int i,tmp;
   tmp=s[0];
   for(i=0;i<n-1;i++)
      s[i]=s[i+1];
   s[n-1]=tmp;
}

(2)改进的算法

static int gcd(int m,int n);/*m,n的最大公约数*/
void rsh(int *s,int n,int t);/*数组s循环左移t位*/

void
rsh(int *s,int n,int t){
     int i,j,k,p,tmp;
     t%=n;
     p=gcd(n,t);
     for(i=0;i<p;i++){
         k=i;j=(i+t)%n;
         tmp=s[i];
         while(j!=i){
            s[k]=s[j];
            k=j;
            j=(k+t)%n;
         }
         s[k]=tmp;
     }
}

static int
gcd(int n,int m){
     int t;
     for(t=n%m;t;){
         n=m;
         m=t;
         t=n%m;
     }
    return m;
}

阅读(2457) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-03-22 22:28:57

多谢指出, 已更正

chinaunix网友2008-03-20 01:04:06

楼主rsh()函数体有误.(非逻辑错误,估计是书写错误). while()体里面,j=(k+i)%n;是不是该:j=(k+t)%n; ?