Вы правы, что сложность O (n ^ 2). Существует более одного способа подойти к вопросу о том, почему.
Формальный способ - подсчитать количество итераций внутреннего цикла, которое будет n-1 в первый раз, затем n-2, затемn-3, ... вплоть до 1, что дает в общей сложности n * (n-1) / 2 итераций, что составляет O (n ^ 2).
Неформальный способ сказатьвнешний цикл выполняется O (n) раз, и «в среднем» i
примерно равно n / 2, поэтому внутренний цикл выполняется в среднем примерно (n - n / 2) = n / 2 раза, что также равно O(п). Таким образом, общее количество итераций составляет O (n) * O (n) = O (n ^ 2).
При использовании обоих этих методов недостаточно просто сказать, что тело цикла выполняет итерацию O (n^ 2) раза - нам также нужно проверить сложность тела внутреннего цикла. В этом коде тело внутреннего цикла просто выполняет несколько присваиваний, поэтому он имеет сложность O (1). Это означает, что общая сложность кода составляет O (n ^ 2) * O (1) = O (n ^ 2). Если бы вместо этого внутреннее тело цикла выполняло, например, двоичный поиск по массиву длины n, то это было бы O (log n), а общая сложность кода, например, составила бы O (n ^ 2 log n).