Сложность времени в современном процессоре может быть практически бесполезной статистикой производительности.
В этом случае у нас есть один алгоритм, который идет от 0 до n-1 - O (N) - и второй, который идет от 0 до n-1 дважды - константа выпадает, поэтому она все еще O (N) , Первый алгоритм имеет дополнительный оператор if
, который будет ложным ровно один раз, и приличный компилятор уничтожит его. Мы получаем одинаковое количество входных данных, одинаковое количество выходных данных, одинаковое количество обращений к массиву (своего рода) и одинаковое количество if (a>b)
.
То, что у второго есть, чего у первого нет, так это детерминизм. Один цикл определяет все для второго. Все входные данные считываются в первом цикле. Это означает, что ЦП может точно видеть, что произойдет раньше времени, потому что он имеет все числа и, таким образом, точно знает, как пойдет каждая ветвь if
и может предсказать со 100% точностью, загрузить кеши, и заполнить конвейеры, чтобы все было готово заранее, не пропуская ни секунды.
Алгоритм 1 не может этого сделать, потому что следующий вход не известен до следующей итерации цикла. Если шаблон ввода не является предсказуемым, он будет угадывать, в каком направлении if(p[i-1]>p[i])
будет часто работать неправильно.
Дополнительное чтение: Почему быстрее обрабатывать отсортированный массив, чем несортированный массив?