回 帖 发 新 帖 刷新版面

主题:大哥帮帮忙

哪位大哥帮帮忙,
设计一个算法,将数组a中的元素a[0]至a[n-1]循环右移k位,并要用一个元素大小的附加存储,元素移动或交换次数为O(n). [em3]

回复列表 (共2个回复)

沙发

循环右移k位和,循环右移k%n位是一样的效果,这样就可以把问题简化到循环右移0~n-1位的情况,最终只需要将一段数据移到尾端,再将后一段数据移到首端。

板凳

void Rotate(Array1D &a, int n, int k)
/* a[n] contains the elements,          */
/* rotate them right circlely by k sits */
{
 int i,p,q;
 char temp;
 p=k%n;            //如果k等于n,相当于不用移动任何元素
 if(p<=n/2)
   {
    while(p)        //当循环次数p减至0时,停止循环
      {
       temp=a[n-1];
       for(i=n-1;i>0;i--)
         a[i]=a[i-1];
       a[0]=temp;
       p--;
      }
   }
 else                //如果p大于n的一半,可以把它看成左移n-p位
   {
    q=n-p;
    while(q)
      {
       temp=a[0];
       for(i=0;i<n-1;i++)
         a[i]=a[i+1];
       a[n-1]=temp;
       q--;
      }      
   }
}
自己编的,不知对不对?

我来回复

您尚未登录,请登录后再回复。点此登录或注册