void gcdrot(int rotdist, int n)
{ int i, j, p;
if (rotdist == 0 || rotdist == n)
return;
i = p = rotdist;
j = n - p;
while (i != j) {
/* invariant:
x[0 ..p-i ] is in final position
x[p-i..p-1 ] = a (to be swapped with b)
x[p ..p+j-1] = b (to be swapped with a)
x[p+j..n-1 ] in final position
*/
if (i > j) {
swap(p-i, p, j);
i -= j;
} else {
swap(p-i, p+j-i, i);
j -= i;
}
}
swap(p-i, p, i);
}
求人分析下 这段代码
功能是 字符串旋转 abcdefgh==> defghabc
我就想知道 这段代码是怎么来的
就是每次 swap 的三个参数
i、j、p之间的关系运算是怎么想出来的 依据是什么
看是看懂了。。
就是不能理解
自己写不出来这种
swap 就是 abcdefgh swap(0,5,3) 从第0位第5位 开始 长度为3 变成 fghdeabc
不知道你是不是从下面的连接中看到的算法。http://blog.csdn.net/qiuyang0607/article/details/7055148
它的目的是交互相邻的数组,如果是相同长度的话直接swap,这里给出swap不使用temp的算法能更省空间:
void swap(int a, int b, int len)
{
int temp;
while(len)
{
x[a]+=x[b];
x[b]=x[a]-x[b];
x[a]=x[a]-x[b];
len--;
a++;
b++;
}
}
回到正题,从左到右(数组索引从左到右依次增大)分为相邻两段数组,i为左边一段长度,j为右边一段长度(这里的i和j在算法中会不断变化,但是始终代表左右的长度),P为初始状态i的长度,这个是为了帮助当i,j改变后在数组中定位的。
算法的原理就是不断减小i和j假如i!=j,最后i和j只能是1.
最简单的例子:abc交换长度为1
i=1,p=1,j=2
第一次交换后cba
i=1,p=1,j=1
第二次交换abc
感谢提供思路。我在编程珠玑上看到的。