Ordenação por Seleção
A ideia por trás do algoritmo de ordenação por seleção é simples. Para um vetor $A$ de $n$ números, execute os seguintes passos:
-
A cada iteração do algoritmo, selecione o menor elemento do vetor $A$ e coloque-o em sua "posição correta".
-
Resolva o problema para os $n - 1$ elementos restantes.
A descrição acima nos dá uma ideia geral do funcionamento do algoritmo, mas ela é um pouco vaga (tão vaga que ela sequer contém uma descrição precisa do que seria a posição correta de um elemento qualquer). Vejamos uma descrição um pouco mais precisa (mas ainda não ideal):
-
Faça
i = 0
-
Repita
n
vezes: + Selecione o menor elemento do vetorV
, a partir da posiçãoi
+ Coloque esse elemento emV[i]
+ Incrementei
Seguindo as regras acima, a cada iteração $i$ do algoritmo, todos os elementos à esquerda do índice $i$ estarão ordenados, e nenhum elemento à direita do elemento no índice $i$ é menor que os elementos à esquerda de $i$.
A partir dessa descrição fica mais fácil entender qual é a "posição correta" de um dado elemento. Com essas ideias em mente, podemos implementar o algoritmo de ordenação por seleção da seguinte forma:
import random
def ordenacao_selecao(A):
n = len(A)
# Percorre o arranjo A.
for i in range(n):
# Encontra o elemento mínimo em A.
minimo = i
for j in range(i + 1, n):
if A[minimo] > A[j]:
minimo = j
# Coloca o elemento mínimo na posição correta.
A[i], A[minimo] = A[minimo], A[i]
A = random.sample(range(-10, 10), 10)
print("Arranjo não ordenado: ", A)
ordenacao_selecao(A)
print("Arranjo ordenado:", A)
Arranjo não ordenado: [9, 7, 3, -7, -9, -4, 0, 5, -10, -8] Arranjo ordenado: [-10, -9, -8, -7, -4, 0, 3, 5, 7, 9]
O algoritmo de ordenação por seleção possui complexidade quadrática ($O(n^2)$) no número de elementos do vetor de entrada, é um algoritmo in-place, mas não é estável.
Se você quiser acompanhar visualmente a execução do algoritmo de ordenação por seleção, veja o excelente vídeo abaixo, feito pelo pessoal do site Algo-Rythmics:
Playground
# Use este espaço para praticar o que você aprendeu nesta seção.
# Basta digitar o código no espaço abaixo e clicar 'run'.