如何使循环阵列旋转更有效?我在这篇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;
}
答案 0 :(得分:1)
我没有使用它,所以我不能保证它会做你需要的一切。但您可能希望仅使用std::rotate
函数替换此函数体。
它应该已经进行了很好的优化,并且不太可能将错误引入您的应用程序。
http://www.sgi.com/tech/stl/rotate.html
如果您想要优化建议,我建议避免所有模运算。它们可能需要除法,这是您可以在处理器上执行的最昂贵的操作之一。它们是考虑如何实现目标的便捷方式,但CPU的执行成本可能非常高。
如果你使用两个循环,你可以删除你的模运算符:一个从中间到结尾,另一个从开始到中间。
但如果可以的话,看看你是否可以完全避免轮换。如果你小心,你可以消除无意义的全数组遍历/复制操作。请参阅我对OP的评论,了解如何完成此任务。