数据结构数组的循环右移K位算法仅使用一个附加的空间交换次数或元素移动时间复杂度为On

46次阅读

共计 437 个字符,预计需要花费 2 分钟才能阅读完成。

数组的循环右移 K 位算法,仅使用一个附加的空间,交换次数或元素移动时间复杂度为 O(n);
/* 步骤分为三步:(K=2)

1. 将第 1 位至第 N-K 位进行反转;1,2,3, 4,5->3,2,1, 4,5
2. 将第 N-K+1 位至第 N 位进行反转;3,2,1, 4,5->3,2,1, 5,4
3. 将整个第 1 位至第 N 位进行反转;3,2,1,5,4->4,5,1,2,3

最终即可实现 循环右移 K 位的算法;*/

void Reverse(int start, int end, int* B)// 逆置函数
{
    int i = start, j = end, temp = 0;// 附加空间
    while (i < j)
    {temp = B[i];
        B[i] = B[j];
        B[j] = temp;
        j--;
        i++;
    }
}
void Exchange(int Num,int k,int* B)// 生成函数
{
    k=k%Num;
    Reverse(0, Num - k - 1, B);// 注意传参时一维数组下标由 0 开始
    Reverse(Num-k, Num-1, B);
    Reverse(0, Num - 1, B);
}

正文完
 0