Skip to content

Bubble Sort


1. Conceitos Gerais

O Bubble Sort (Ordenação por Bolha) é um algoritmo de ordenação simples que funciona repetidamente percorrendo o array, comparando elementos adjacentes e trocando-os se estiverem na ordem errada.

Princípio fundamental: "Flutuação" - os elementos maiores "borbulham" para o final do array a cada passagem completa.


2. Implementação do Bubble Sort

Implementação:
void bubble_sort(int v[], int l, int r) {
    int swap = 1;

    while (r > l && swap) {          // Loop externo: O(n)
        swap = 0;

        // Percorre o array comparando elementos adjacentes
        for (int j = l; j < r; j++) { // Loop interno: O(n)
            if (v[j] > v[j + 1]) {    // Comparação
                // Troca os elementos se estiverem na ordem errada
                exch(v[j], v[j + 1]); // Troca: O(1)
                swap = 1;
            }
        }
        r--;  // Reduz o limite, pois o último elemento já está na posição correta
    }
}

3. Funcionamento Passo a Passo

3.1 Exemplo com Array Pequeno

Exemplo:
Array inicial: [64, 34, 25, 12, 22, 11, 90]

Primeira passagem (r=6):
- [34, 64, 25, 12, 22, 11, 90] (troca 64-34)
- [34, 25, 64, 12, 22, 11, 90] (troca 64-25)
- [34, 25, 12, 64, 22, 11, 90] (troca 64-12)
- [34, 25, 12, 22, 64, 11, 90] (troca 64-22)
- [34, 25, 12, 22, 11, 64, 90] (troca 64-11)
- [34, 25, 12, 22, 11, 64, 90] (sem troca 64-90)
- Array após 1ª passagem: [34, 25, 12, 22, 11, 64, 90]

Segunda passagem (r=5):
- [25, 34, 12, 22, 11, 64, 90] (troca 34-25)
- [25, 12, 34, 22, 11, 64, 90] (troca 34-12)
- [25, 12, 22, 34, 11, 64, 90] (troca 34-22)
- [25, 12, 22, 11, 34, 64, 90] (troca 34-11)
- Array após 2ª passagem: [25, 12, 22, 11, 34, 64, 90]

Terceira passagem (r=4):
- [12, 25, 22, 11, 34, 64, 90] (troca 25-12)
- [12, 22, 25, 11, 34, 64, 90] (troca 25-22)
- [12, 22, 11, 25, 34, 64, 90] (troca 25-11)
- Array após 3ª passagem: [12, 22, 11, 25, 34, 64, 90]

Quarta passagem (r=3):
- [12, 22, 11, 25, 34, 64, 90] (sem troca 12-22)
- [12, 11, 22, 25, 34, 64, 90] (troca 22-11)
- Array após 4ª passagem: [12, 11, 22, 25, 34, 64, 90]

Quinta passagem (r=2):
- [11, 12, 22, 25, 34, 64, 90] (troca 12-11)
- Array final ordenado: [11, 12, 22, 25, 34, 64, 90]

3.2 Visualização Gráfica

Implementação:
Array inicial: [64, 34, 25, 12, 22, 11, 90]

Passagem 1: [34, 25, 12, 22, 11, 64, 90] (5 trocas)
Passagem 2: [25, 12, 22, 11, 34, 64, 90] (4 trocas)  
Passagem 3: [12, 22, 11, 25, 34, 64, 90] (3 trocas)
Passagem 4: [12, 11, 22, 25, 34, 64, 90] (1 troca)
Passagem 5: [11, 12, 22, 25, 34, 64, 90] (1 troca)

Array ordenado: [11, 12, 22, 25, 34, 64, 90]

4. Análise do Algoritmo

4.1 Características

4.1 Características

Aspecto Quick Sort
Estabilidade Sim
Adaptabilidade Sim
In-Place Sim
Lista Encadeada Não

4.2 Complexidade

Caso Complexidade Descrição
Melhor caso O(n) Array já ordenado (versão otimizada)
Caso médio O(n²) Array em ordem aleatória
Pior caso O(n²) Array em ordem inversa

4.3 Vantagens

  • Simplicidade: Fácil de implementar e entender;
  • Adaptabilidade: Versão otimizada detecta arrays já ordenados;
  • Estabilidade: Mantém a ordem relativa de elementos iguais;
  • Baixo overhead: Pouca memória adicional necessária;
  • Útil para arrays pequenos ou quase ordenados;

4.4 Desvantagens

  • Complexidade quadrática: Ineficiente para arrays grandes;
  • Muitas trocas: Pode realizar até O(n²) trocas;
  • Pouco eficiente: Comparado a algoritmos O(n log n);
  • Performance ruim: Em arrays grandes ou desordenados;

4.5 Quando Escolher

  • Arrays muito pequenos (n < 20)
  • Arrays quase ordenados (poucas trocas necessárias)
  • Implementação educacional
  • Quando a estabilidade é importante
  • Memória extremamente limitada