2015-03-12 2 views
0

новой информатики здесь, так что я написал этот пузырь код сортировки и пытаюсь вычислить это время сложность и производительность здесь, код для сортировки здесь:Является ли моя временная сложность правильной для моего кода сортировки пузыря?

for (int i = 0; i < size; i++) 
{ 
    Node current = head.next; 
    while (current.next != tail) 
    { 
    if (current.element.depth < current.next.element.depth) 
    { 
     swap(current, current.next); 
    } 
    else 
    { 
     current = current.next; 
    } 
    } 
} 

Код метода подкачки здесь:

void swap(Node nodeA, Node nodeB) 
{ 
    Node before = nodeA.prev; 
    Node after = nodeB.next; 
    before.next = nodeB; 
    after.prev = nodeA; 
    nodeB.next = nodeA; 
    nodeB.prev = before; 
    nodeA.prev = nodeB; 
    nodeA.next = after; 
} 

Теперь я знаю, что временная сложность в пузырьковой сортировке находится в производительности наихудшей O(n^2), но я пытаюсь вычислить функцию каждых расстрелов по моему для цикла здесь. У меня есть базовое понимание временной сложности, я знаю, что стандарт для цикла равен f(n) = 2n + 2, и мы рассматриваем худший сценарий временной сложности. До сих пор это моя мысль прогресса, чтобы найти f(n) моего кода:

int i = 0;   This will be executed only once. 
i < size;    This will be executed N+1 times. 
i ++;     This will be executed N times. 
current = head.next; This will be executed N times. 
current.next != tail; This will be executed N times. 

And since a while loop is within the for loop, 
    it's n*n within the while loop, there 
    are 4 operations, so it's 4n^2. 

В худшем случае, я буду использовать метод SWAP каждый раз, и так как мое время сложность для метода подкачки просто 8 (я думаю, это только 8 исполнений правильно?) Итак, худший сценарий для swap(current,current.next) - 8n?

Если мы добавим их:

f(n) = 1 + n + 1 + n + n + n+ 4n^2 + 8n 

f(n) = 4n^2 + 12n + 2 

f(n) ~ O(n^2) 

ли мое время сложность f(n) правильно?

Если нет, можете ли вы указать мне правильный ответ, пожалуйста, также есть ли у вас предложения по улучшению производительности моего кода?

ответ

0

Поскольку у вас есть цикл while внутри цикла for - да, у вас есть сложность O (n^2), которая считается плохим.

Правило здесь, как не следует (для N входных элементов, из лучшего к худшему):

  • нет петель, только некоторые казни, независимо от размера входного = O (1)
  • Loop (N/M) (вы делите вход на каждой итерации) = O (log N)
  • Только одна петля над N элементами = O (N)
  • Loop2 (N) внутри Loop1 (N) = O (N^2)

См. Этот ответ для лучшего пояснения: What does O(log n) mean exactly?