Menu
Coddy logo textTech

Selection Sort

Última atualização

O selection sort divide o array em uma região ordenada à esquerda e uma região não ordenada à direita. Em cada passagem ele percorre a região não ordenada para encontrar o menor elemento e então o troca para a primeira posição não ordenada, aumentando a região ordenada em um. Pressione reproduzir acima para ver a varredura e troca, ou avance uma comparação de cada vez.

O selection sort sempre faz o mesmo número de comparações independentemente da entrada, mas realiza no máximo n-1 trocas - muito menos que o bubble sort - o que importa quando as escritas são caras.

Complexidade de tempo e espaço

CasoComplexidadeNotas
Melhor casoO(n²)As comparações acontecem mesmo se já estiver ordenado
Caso médioO(n²)Ordem aleatória
Pior casoO(n²)Ordem inversa
EspaçoO(1)No próprio lugar
EstávelNãoAs trocas podem reordenar elementos iguais

Passo a passo

PassoO que acontece
1Trate todo o array como não ordenado.
2Percorra a região não ordenada para encontrar o elemento mínimo.
3Troque esse mínimo para a primeira posição não ordenada.
4Mova o limite um passo à direita (essa posição já está ordenada).
5Repita até restar apenas um elemento não ordenado.

Exemplo resolvido

Ordenando [5, 2, 4, 1]:

PassagemArrayAção
Início[5, 2, 4, 1]Todo o array está não ordenado.
1[1, 2, 4, 5]Percorre [5, 2, 4, 1], o mínimo é 1 no índice 3; troca com o índice 0.
2[1, 2, 4, 5]Percorre [2, 4, 5], o mínimo é 2 já no índice 1; troca consigo mesmo.
3[1, 2, 4, 5]Percorre [4, 5], o mínimo é 4 já no índice 2; nenhum movimento necessário.
Fim[1, 2, 4, 5]Resta apenas 5, então ele já está no lugar.

Quando usar o selection sort

Use quandoEvite quando
As escritas são caras - ele faz no máximo n-1 trocas.O array é grande - as O(n²) comparações dominam.
Você precisa de uma ordenação no próprio lugar simples e fácil de implementar.Você precisa de uma ordenação estável que preserve a ordem de chaves iguais.
A memória é limitada - ele usa apenas O(1) de espaço extra.Os dados estão quase ordenados - ele não pode terminar antes como o insertion sort.
O conjunto de dados é minúsculo e o desempenho previsível importa.A vazão importa - ordenações O(n log n) como o quicksort são muito mais rápidas.

Código de Selection Sort

Uma implementação limpa e executável de Selection Sort em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Selection Sort em Python

Python
1def selection_sort(a):2    n = len(a)3    for i in range(n - 1):4        # Find the smallest element in the unsorted tail5        min_idx = i6        for j in range(i + 1, n):7            if a[j] < a[min_idx]:8                min_idx = j9        a[i], a[min_idx] = a[min_idx], a[i]10    return a11
12
13nums = [64, 25, 12, 22, 11]14print("Before:", nums)15selection_sort(nums)16print("After: ", nums)
Execute este código no Playground de Python

Perguntas frequentes sobre Selection Sort

Qual é a complexidade de tempo do selection sort?
O selection sort é O(n²) em todos os casos - melhor, médio e pior - porque sempre percorre toda a região não ordenada para encontrar cada mínimo. Ele usa O(1) de espaço extra.
O selection sort é estável?
A versão padrão no próprio lugar não é estável, porque trocar um mínimo distante para a posição pode mover um elemento igual à frente de outro. Existe uma variante estável, mas ela exige deslocar em vez de trocar.
Quando o selection sort é útil?
Ele é útil quando o custo de escrever na memória é alto, já que realiza no máximo n-1 trocas - o mínimo possível para uma ordenação por comparação que move elementos.
Qual é a diferença entre selection sort e bubble sort?
Ambos são ordenações por comparação O(n²), mas o selection sort faz no máximo n-1 trocas enquanto o bubble sort pode fazer até O(n²) trocas. O bubble sort também pode detectar um array já ordenado e parar antes, ao passo que o selection sort sempre executa todas as passagens.
Devo usar selection sort ou insertion sort?
Na maioria dos casos prefira o insertion sort - ele é estável, roda em O(n) em dados quase ordenados e é mais rápido em média. Escolha o selection sort apenas quando minimizar o número de escritas for a prioridade, pois ele garante no máximo n-1 trocas.
Por que o selection sort sempre roda em O(n²) mesmo em um array ordenado?
O selection sort não tem como saber que um elemento já é o mínimo sem percorrer o resto da região não ordenada, então realiza todas as comparações em cada passagem independentemente da ordem de entrada. Por isso o melhor caso é igual ao pior em O(n²) - diferente do insertion ou bubble sort, que podem interromper cedo.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR