首页 新闻 赞助 找找看

求分析一段代码思路。

0
悬赏园豆:10 [已解决问题] 解决于 2012-03-26 22:40
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

细胞核的主页 细胞核 | 初学一级 | 园豆:193
提问于:2012-03-25 22:52
< >
分享
最佳答案
0

不知道你是不是从下面的连接中看到的算法。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

收获园豆:10
today4king | 老鸟四级 |园豆:3499 | 2012-03-26 15:23

感谢提供思路。我在编程珠玑上看到的。

细胞核 | 园豆:193 (初学一级) | 2012-03-26 22:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册