Альтернативный способ думать об этом - это то, каким будет максимальное значение i
до его сброса. Это, как выясняется, упрощает рассуждение о том, как предыдущий порядок сортировки A
влияет на время выполнения алгоритма.
В частности, i
обратите внимание, что, когда устанавливает новое максимальное значение, назовем его N, массив [A[0], ..., A[N-1]]
сортируется в порядке возрастания.
Так что же происходит, когда мы добавляем элемент A[N]
в микс?
Математика:
Ну, допустим, он помещается в положение . Затем нам нужно итераций цикла (которые я буду обозначать ), чтобы переместить его на , итераций, чтобы переместить на , и вообще:pNNstepsN−1N+(N−1)N−2
stepsN(pN)=N+(N−1)+(N−2)+⋯+(pN+1)=12(N(N+1)−pN(pN+1))
Для случайно отсортированного массива принимает равномерное распределение по для каждого , с:pN{0,1,…,N}N
E(stepsN(pN))=∑a=1NP(pN=a)stepsN(a)=∑a=1N1N12(N(N+1)−a(a+1))=12(N(N+1)−13(N+1)(N+2))=13(N2−1)=Θ(N2)
сумма может быть показана с использованием формулы Фолхабера или ссылки Wolfram Alpha внизу.
Для обратно отсортированного массива, для всех , и мы получаем:pN=0N
stepsN(pN)=12N(N+1)
точно, принимая строго дольше, чем любое другое значение .pN
Для уже отсортированного массива и , причем члены младшего порядка становятся актуальными.pN=NstepsN(pN)=0
Общее время:
Для того, чтобы получить общее время, мы подведем шаги по всему . (Если бы мы были очень осторожны, мы суммировали бы свопы, а также итерации цикла, и позаботились бы о начальных и конечных условиях, но довольно легко увидеть, что они не вносят свой вклад в сложность в большинстве случаев) ,N
И снова, используя линейность ожидания и формулу Фолхабера:
Expected Total Steps=E(∑N=1nstepsN(pN))=∑N=1nE(stepsN(pN))=Θ(n3)
Конечно, если по какой-то причине не является (например, распределение массивов, на которые мы смотрим, уже очень близко к сортировке), то это не всегда нужно быть так. Но для этого очень специфичные дистрибутивы на !stepsN(pN)Θ(N2)pN
Соответствующее чтение: