Jedynym algorytmem z dwoma wspomnianymi operatorami, który jest dość wydajny, jest sortowanie bąbelkowe. Złożoność algorytmu wynosi w najgorszym przypadku .O(n2)
Zakładam, że oprócz dwóch operacji, możemy również sprawdzić, czy jesteśmy na skrajnej prawej (Op 3), czy skrajnie lewej (Op 4), albo za pomocą wartowników i albo przez jakąś operację na liście . Powinniśmy także mieć operację porównania (Op 5) podaną osobno lub w połączeniu z operacją zamiany. Jeśli operacja porównania jest połączona z operacją wymiany, to musi nam powiedzieć, czy zamiana została wykonana, czy nie.+ ∞−∞+∞
Algorytm, który nie używa flagi boolowskiej, aby wiedzieć, czy zamieniliśmy dowolny element, jest podany poniżej (sztuczka polegająca na utrzymywaniu informacji w stanie maszyny, a nie pamięci):
Start:
Do until we are not at the leftmost position (Op 4)
move left (Op 2b)
Check:
If we are at rightmost position (Op 3)
goto Finished:
If current value is larger than next value (Op 5)
goto Unfinished:
move right (Op 2a)
Repeat Check:
Unfinished:
If we are at rightmost position (Op 3)
goto Start:
If current value is larger than next value (Op 5)
swap the elements (Op 1) and move right (Op 2a)
Repeat Unfinished:
Finished:
The list is sorted now, output it.
Rozwiązanie Erica Lipperta, gnome sort, również działa, ponieważ w zasadzie jest to dwukierunkowy sortowanie bąbelkowe.