Алгоритм меняет два элемента, которые находятся на одинаковом расстоянии от обоих концов массива. Необходимое количество операций - number_of_operations = number_of_elements / number_elements_operated_on
, и, поскольку он выполняет два элемента одновременно, это number_of_elements / 2
. И, следовательно, причина использования arr.length / 2
в качестве ограничения for
l oop. Вот представление о том, что происходит.
Учитывая массив [1, 2, 3, 4, 5, 6]
, тогда array.length
равен 6
и выполняются следующие операции:
//loop i = 0, 0 < 3 == true, execute
[1, 2, 3, 4, 5, 6] -> [6, 2, 3, 4, 5, 1]
^--------------^ ^--------------^
//loop i = 1, 1 < 3 == true, execute
[6, 2, 3, 4, 5, 1] -> [6, 5, 3, 4, 2, 1]
^--------^ ^--------^
//loop i = 2, 2 < 3 == true, execute
[6, 5, 3, 4, 2, 1] -> [6, 5, 4, 3, 2, 1]
^--^ ^--^
//i = 3, 3 < 3 == false, loop stops
Это прекрасно работает с нечетным число элементов, так как при его получении будет только один элемент посередине.
Если задан массив [1, 2, 3, 4, 5]
, тогда array.length
равен 5
, и выполняются следующие операции:
//loop i = 0, 0 < 2.5 == true, execute
[1, 2, 3, 4, 5] -> [5, 2, 3, 4, 1]
^-----------^ ^-----------^
//loop i = 1, 1 < 2.5 == true, execute
[5, 2, 3, 4, 1] -> [5, 4, 3, 2, 1]
^-----^ ^-----^
//loop i = 2, 2 < 2.5 == true, execute
[5, 2, 3, 4, 1] -> [5, 4, 3, 2, 1]
^ ^
//i = 3, 3 < 2.5 == false, loop stops