如何使我的阵列旋转更高效?

时间:2011-10-30 01:18:00

标签: c++ arrays rotation

如何使循环阵列旋转更有效?我在这篇thread中读到了一个很好的排序算法,但是它不能用于我需要的东西,因为在数组的末尾有空格被分类到中间。

旋转功能需要适用于左右旋转。并非阵列的每个空间都会被填充。

void Quack::rotate(int r)
{
    if(r > 0) //if r is positive, rotate left
    {
        for(int i = 0; i < r; i++)
            items[(qBack + i) % qCapacity] = items[(qFront + i) % qCapacity];
            //move items in array
    }
    else if(r < 0) //if r is negative, rotate right
    {
        for(int i = 0; i < (r * -1); i++)
            items[(qFront - i - 1) % qCapacity] =
                items[(qBack - i - 1) % qCapacity];
            //move items in array
    }
    //if r = 0, nothing happens

    //rotate front and back by r
    qFront = (qFront + r) % qCapacity;
    qBack = (qBack + r) % qCapacity;
}

1 个答案:

答案 0 :(得分:1)

我没有使用它,所以我不能保证它会做你需要的一切。但您可能希望仅使用std::rotate函数替换此函数体。

它应该已经进行了很好的优化,并且不太可能将错误引入您的应用程序。

http://www.sgi.com/tech/stl/rotate.html

如果您想要优化建议,我建议避免所有模运算。它们可能需要除法,这是您可以在处理器上执行的最昂贵的操作之一。它们是考虑如何实现目标的便捷方式,但CPU的执行成本可能非常高。

如果你使用两个循环,你可以删除你的模运算符:一个从中间到结尾,另一个从开始到中间。

但如果可以的话,看看你是否可以完全避免轮换。如果你小心,你可以消除无意义的全数组遍历/复制操作。请参阅我对OP的评论,了解如何完成此任务。