как рассчитать сложность времени сортировки пузырьков
Я пытался понять структуру данных и другой алгоритм, затем я запутался, чтобы измерить сложность времени сортировки пузыря.
for (c = 0; c < ( n - 1 ); c++) {
for (d = 0; d < n - c - 1; d++) {
if (array[d] > array[d+1]) /* For descending order use < */
{
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
}
}
}
теперь каждый большой O говорит лучший случай O(n), случай Avg(n2) и худший случай (n2).Но когда я вижу код, найденный в первой фазе внутреннего цикла запуска n раз, то во второй фазе n-1, и n - 2 и так далее. Это означает, что в каждой итерации его значение уменьшается. Например, если у меня есть[] = {4, 2, 9, 5, 3, 6, 11} таким образом, общее число сравнений будет -
1st Phase - 7 time
2nd phase - 6 time
3rd Phase - 5 time
4th Phase - 4 time
5th Phase - 3 time
6th Phase - 2 time
7th Phase - 1 time
поэтому, когда я вычисляю время, оно выглядит так = (7 + 6 + 5 + 4 + 3 + 2 + 1) + 7 = 35, но худшая сложность времени-n2 согласно doc.
Так может кто-нибудь сказать мне, как рассчитать правильное значение.
6 ответов
давайте рассмотрим случаи для Big O для Bubble Sort
Случай 1) O (n) (лучший случай) На этот раз сложность может возникнуть, если массив уже отсортирован, а это означает, что своп не произошел и только 1 итерация из n элементов
случай 2) O (n^2) (Худший случай) В худшем случае если массив уже отсортирован, но в порядке убывания. Это означает, что на первой итерации он должен был бы смотреть на n элементов, затем после этого он будет выглядеть n - 1 элементов (так как самый большой integer находится в конце) и так далее и так далее, пока не произойдет сравнение 1. Big-O = n + n-1 + n-2 ... + 1 = (n*(n + 1))/2 = O (n^2)
в вашем примере он может не рассматривать эти многие элементы в каждой фазе, поскольку массив не находится в порядке убывания.
Итак, вы заметили, что общее количество проведенных сравнений равно n + (n - 1) + ... + 2 + 1. Эта сумма равна n * (Н + 1) / 2 (см. Треугольные Числа), который равен 0.5 n^2 + 0.5 n, что явно O(n^2).
Он делает сравнение между двумя элементами. так в 1-й этап-сравнение n-1. Я. e, 6 2-й этап-сравнение n-2. Я. e, 5 и так до 1. и, таким образом, sum = n(n-1)/2 i.e O (n^2).
Если есть любые ошибки можно исправить.....
O(n^2) = n(n-1)/2
является правильным.
как в приведенном выше примере 5 элементов.
5(5-1)/2 == 10.
5(5+1)/2 != 10.
объяснение наихудшего случая здесь:
elements = raw_input("enter comma separated elements : ")
elements = elements.split(',')
elements = map(int, elements)
length = len(elements)
for i in xrange(length - 1):
print "outer pass : ", i
for j in xrange(length - i - 1):
print "inner pass : ", j
if elements[j] > elements[j + 1]:
elements[j + 1], elements[j] = elements[j], elements[j + 1]
print "elements : ", elements
print elements
выход :
введите разделенные запятыми элементы: 5,4,3,2,1
внешний проход : 0
внутренний пропуск : 0
элементы : [4, 5, 3, 2, 1]
внутренний пропуск : 1
элементы : [4, 3, 5, 2, 1]
внутренний проход : 2
элементы : [4, 3, 2, 5, 1]
внутренний пропуск : 3
элементов : [4, 3, 2, 1, 5]
внешний пропуск: 1
внутренний пропуск : 0
элементы : [3, 4, 2, 1, 5]
внутренний пропуск : 1
элементы : [3, 2, 4, 1, 5]
внутренний проход : 2
элементы : [3, 2, 1, 4, 5]
внешний проход : 2
внутренний пропуск : 0
элементы : [2, 3, 1, 4, 5]
внутренний пропуск : 1
элементы : [2, 1, 3, 4, 5]
внешний проход : 3
внутренний пропуск : 0
элементы : [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
таким образом, первая итерация все n элементов сканируются, он будет сканировать n - 1 элементов в следующей итерации. Так далее для всех элементов.
n + n-1 + n-2 ... + 1 = (n * (n + 1))/2 = O (n^2)
для n чисел общее количество проведенных сравнений будет (n-1)+... + 2 + 1. Эта сумма равна (n-1) * n / 2 (см. треугольные числа), которая равна 0,5 N^2 - 0,5 n, т. е. O(n^2)