Escrito por
Mateus Almeida
em
Análise Bubble Sort
Pseudocódigo
1 |PROCEDIMENTO BubbleSort(A[] : Inteiro):
2 |VAR
3 | |i, j, t : Inteiro
4 |INICIO
5 | |PARA i <- Comprimento(A) ATÉ 1, FAÇA:
6 | | |PARA j <- 2, ATÉ i, FAÇA:
7 | | | |SE A[j - 1] > A[j], ENTÃO:
8 | | | | |t <- A[j - 1]
9 | | | | |A[j - 1] <- A[j]
10 | | | | |A[j] <- t
11 | | | |FIM-SE
12 | | |FIM-PARA
13 | |FIM-PARA
14 |FIM
Corretude
Laço invariante
Laço para as linhas 5 a 13.
Invariante
Na i-ésima iteração, temos que A[i+1..N] contém os N-i maiores elementos ordenados.
Inicialização
Antes da primeira iteração, temos que i=N, logo A[i+1..N] é vazio. Portanto, o invariante é trivialmente verdadeiro.
Manutenção
Supondo que o invariante é verdadeiro antes da i-ésima iteração, temos que os elementos A[1..i] são menores ou iguais a A[i+1]. Na i-ésima iteração, o laço PARA (linhas 6 a 12) faz a variável j assumir os valores de 2 até i e, para cada valor de j, as linhas de 7 a 11 realizam a troca entre os valores de A[j-1] e A[j], caso A[j-1] > A[j]. Assim, o maior elemento entre A[j-1] e A[j] sempre ficará na posição j. Como j varia de 2 até i, ao final do laço teremos o maior elemento de A[1..i] guardado na posição i. Desta forma, os elementos em A[1..i-1] serão menores ou iguais a A[i]. Pela propriedade invariante, os elementos em A[i+1..N] estão ordenados e são maiores que A[i]. Logo, temos que A[i..N] contém N-1+1 maiores elementos de A ordenados.
Finalização
Após a n-ésima iteração do laço invariante, temos i=0 e, pela propriedade invariante, A[1..N] contém os N elementos de A ordenados.
Complexidade de tempo
O melhor caso para o bubble sort ocorre quando o vetor está ordenado, assim, o laço será executado apenas uma vez e não será feita trocas.
O pior caso ocorre quando o vetor está ordenado de forma inversa, assim, o laço interno terá que percorrer todo o vetor em cada iteração, resultando em uma complexidade O(n^2) devido a quantidade de trocas que sempre irá ocorrer.
O caso médio também é O(n^2), pois, o algoritmo percorre o vetor diversas vezes realizando trocas, independentemente da ordem dos elementos.
\[1+2+3+...+n-3+n-2+n-1+n
\\= \sum_{i=1}^{n}i \\= n(n+1)/2\]
Melhor caso
\[\sum_{i=1}^{n}\sum_{j=2}^{i}1
\\
=\sum_{i=1}^{n}(i-1)-(1)+1
\\
=\sum_{i=1}^{n}i-1
\\
=1\sum_{i=1}^{n}i = \Omega(n^{2})\]
Pior caso
\[\sum_{i=1}^{n}\sum_{j=2}^{i}1
\\
=\sum_{i=1}^{n}(i-1)-(1)+1
\\
=\sum_{i=1}^{n}i-1
\\
=(n-1)((n-1)+1)/2
\\
=n(n-1)/2
\\
=(n^{2}-n)/2 = O(n^{2})\]
Caso médio
\[E\left [ x \right ] = (0 + 1)1/2 = 1/2\]
\[\sum_{i=1}^{n}\sum_{j=2}^{i}E\left [ x \right ]
\\
=\sum_{i=1}^{n}\sum_{j=2}^{i}1/2
\\
=1/2\sum_{i=1}^{n}\sum_{j=2}^{i}1
\\
=1/2(n(n-1)/2)
\\
=n(n-1)/4 = \Theta(n^{2})\]