Skip to content

Selection Sort


1. Conceitos Gerais

O Selection Sort (Ordenação por Seleção) é um algoritmo de ordenação simples que funciona selecionando repetidamente o menor (ou maior) elemento da parte não ordenada do array e movendo-o para a posição correta.

Princípio fundamental: "Selecionar e posicionar" - a cada iteração, encontra-se o menor elemento restante e coloca-o na posição correta.


2. Implementação do Selection Sort

Implementação:
void selection_sort(int v[], int l, int r) {
    int menor;

    for (int i = l; i < r; i++) {         // Loop externo: O(n)
        menor = i;                         // Assume que o atual é o menor

        // Encontra o menor elemento na parte não ordenada
        for (int j = i + 1; j <= r; j++) { // Loop interno: O(n)
            if (v[j] < v[menor]) {         // Comparação
                menor = j;                 // Atualiza o índice do menor
            }
        }

        // Troca o menor elemento com o elemento na posição i
        if (i != menor) {
            int temp = v[i];               // Troca: O(1)
            v[i] = v[menor];
            v[menor] = temp;
        }
    }
}

3. Funcionamento Passo a Passo

3.1 Exemplo com Array Pequeno

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

Passo 1 (i=0):
- Encontrar menor: 11 (índice 4)
- Trocar v[0] (64) com v[4] (11)
- Array: [11, 25, 12, 22, 64]

Passo 2 (i=1):
- Encontrar menor: 12 (índice 2)  
- Trocar v[1] (25) com v[2] (12)
- Array: [11, 12, 25, 22, 64]

Passo 3 (i=2):
- Encontrar menor: 22 (índice 3)
- Trocar v[2] (25) com v[3] (22)
- Array: [11, 12, 22, 25, 64]

Passo 4 (i=3):
- Encontrar menor: 25 (índice 3)
- Sem troca necessária
- Array final ordenado: [11, 12, 22, 25, 64]

3.2 Visualização Gráfica

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

Iteração 0: [64, 25, 12, 22, 11]  Menor: 11  Troca: [11, 25, 12, 22, 64]
Iteração 1: [11, 25, 12, 22, 64]  Menor: 12  Troca: [11, 12, 25, 22, 64]  
Iteração 2: [11, 12, 25, 22, 64]  Menor: 22  Troca: [11, 12, 22, 25, 64]
Iteração 3: [11, 12, 22, 25, 64]  Menor: 25  Sem troca

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

4. Análise do Algoritmo

4.1 Características

4.1 Características

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

4.2 Complexidade

Caso Complexidade Descrição
Melhor caso O(n²) Array já ordenado
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;
  • Baixo overhead: Pouca memória adicional necessária;
  • Poucas trocas: Apenas n-1 trocas no máximo;
  • Útil para arrays pequenos ou quase ordenados;

4.4 Desvantagens

  • Complexidade quadrática: Ineficiente para arrays grandes;
  • Não adaptativo: Performance não melhora com arrays parcialmente ordenados;
  • Não estável: Não mantém ordem relativa de elementos iguais;
  • Pouco eficiente: Comparado a algoritmos O(n log n);

4.5 Quando Escolher

  • Arrays muito pequenos (n < 20)
  • Memória extremamente limitada
  • Implementação educacional
  • Quando trocas são custosas (em termos de hardware)