円形アレイの回転をより効率的にするにはどうすればよいですか?私は優秀なソートアルゴリズムについては、この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;
}
ない、これは必ずしもあなたを助けます(あなたが解決しようとしている、より高いレベルの問題に依存します)が、あなたは可能性が開始オフセットを保持することによって、アレイ「回転」、およびちょうどあなたのアルゴリズムでループを調整していること。そのオフセットで読み込みを開始させ、最後まで読み込み、そのオフセットまで先頭から読み込みを続けます。 –
回転の良いバージョンは、3つの反転として行われます:左のビットを反転させ、次に右のビットを反転し、次にアレイ全体を反転させます。しかしこれはより速いかもしれません。 –