摘要:
要将一个数组的所有元素向左旋转k位,通常有三种算法:算法1(分组交换):若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a 和b1。不断将数组划分和交换,直到不能再划分为止。分组过程与求最大公约数很相似。读写内存各 n到2*n次算法2 (三次反转)利用ba=(br)r(ar)r=(arbr)r,先分别反转a、b,最后再对所有元素进行一次反转。读写内存各约2*n次算法3 (使用循环链)假设 n、k的最大公约数为M,则所有序号为 (i + j*k) % n (0<= i &l 阅读全文