主题:大哥帮帮忙
第九梦
[专家分:0] 发布于 2006-04-25 12:46:00
哪位大哥帮帮忙,
设计一个算法,将数组a中的元素a[0]至a[n-1]循环右移k位,并要用一个元素大小的附加存储,元素移动或交换次数为O(n). [em3]
回复列表 (共2个回复)
沙发
rickone [专家分:15390] 发布于 2006-04-27 13:39:00
循环右移k位和,循环右移k%n位是一样的效果,这样就可以把问题简化到循环右移0~n-1位的情况,最终只需要将一段数据移到尾端,再将后一段数据移到首端。
板凳
海上飞洪 [专家分:520] 发布于 2006-04-27 16:22:00
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--;
}
}
}
自己编的,不知对不对?
我来回复