Единственный алгоритм с двумя упомянутыми вами операторами, который достаточно эффективен, - это пузырьковая сортировка. Сложность алгоритма в худшем случае .O(n2)
Я также предполагаю, что помимо этих двух операций, мы также можем проверить, находимся ли мы в самой правой (Op 3) или самой левой позиции (Op 4), либо с помощью часовых и либо с помощью какой-либо операции в списке , Также у нас должна быть операция сравнения (Op 5), заданная отдельно или в сочетании с операцией свопинга. Если операция сравнения сочетается с операцией подкачки, то она должна сообщить нам, был ли выполнен обмен или нет.+ ∞−∞+∞
Алгоритм, который не использует логический флаг, чтобы узнать, поменяли ли мы какой-либо элемент или нет, приведен ниже (хитрость для сохранения информации в состоянии машины, а не памяти):
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.
Решение Эрика Липперта, сортировка гномов, также работает, потому что в основном это двусторонняя пузырьковая сортировка.