Drobiazgi
Odwracamy, obracamy...
Dana jest -elementowa tablica
którą chcemy odwrócić, czyli spowodować, że jej elementy będą zapisane w kolejności
Najłatwiej to zrobić w miejscu (czyli używając jedynie stałej liczby komórek pamięci dla zmiennych pomocniczych), korzystając z instrukcji zamieniającej miejscami wartości dwóch elementów:
Nietrudno się przekonać, że powyższy kod wywołuje instrukcję zamiany jedynie razy, co w przypadku odwrócenia tablicy jest wynikiem optymalnym.
A teraz trudniejsze zadanie: chcemy tę samą tablicę obrócić o komórek w lewo, czyli ustawić jej elementy w kolejności
I tym razem spróbujmy to zrobić, używając jedynie instrukcji zamiany.
Można w tym celu trzykrotnie wywołać omówioną przed chwilą procedurę odwracania tablicy:
![rev(a[1..k]);rev(a[k+ 1..n]);rev(a[1..n]);](/math/temat/informatyka/algorytmy/2016/01/27/Odwracamy_obracamy_/1x-4825c3ff5c125eafa506f38f0866aee080d6502a-dm-33,33,33-FF,FF,FF.gif)
Ten kod wykona instrukcji zamiany, co w zależności od parzystości liczb
i
da nam
lub
instrukcji. Pytanie: czy da się mniej?
Poniższy kod obraca tablicę, dzieląc ją na cykli o długości
i wykonując obrót każdego z nich niezależnie, do czego potrzebuje
instrukcji zamiany:
Operacja oznacza tu
Zatem w tym rozwiązaniu użyjemy w sumie
instrukcji zamiany. A czy ten wynik da się poprawić?