A ordenação por seleção (do inglês, selection sort) é um algoritmo de ordenação baseado em se passar sempre o menor valor do vetor para a primeira posição (ou o maior dependendo da ordem requerida), depois o de segundo menor valor para a segunda posição, e assim é feito sucessivamente com os elementos restantes, até os últimos dois elementos.
Descrição do algoritmo
É composto por dois laços, um laço externo e outro interno. O laço externo serve para controlar o índice inicial e o interno percorre todo o vetor. Na primeira iteração do laço externo o índice começa de 0 e cada iteração ele soma uma unidade até o final do vetor e o laço mais interno percorre o vetor começando desse índice externo + 1 até o final do vetor. Isso ficará mais explícito no exemplo.
Exemplo:
vetor = 9 - 7 - 8 - 1 - 2 - 0 - 4
O primeiro laço o índice inicial é 0. O laço mais interno começa do índice 1 (índice_inicial_externo + 1) e percorre o vetor até achar o menor elemento, neste caso o número zero. O zero passa para a posição inicial do vetor que na primeira iteração do laço é 0.
0 - 7 - 8 - 1 - 2 - 9 - 4
Ao fim do laço interno, o laço externo incrementa uma unidade, agora a posição inicial do vetor passa a ser 1, pois o zero já se encontra no lugar dele, não é preciso mais fazer verificações pois ele é o menor elemento deste vetor. Agora o processo se repete, buscando o segundo menor elemento, neste caso o um.
0 - 1 - 8 - 7 - 2 - 9 - 4
Consequentemente o terceiro menor, quarto menor,...
Assim sucessivamente até o vetor está ordenado.
0 - 1 - 2 -7 - 8 - 9 - 4
...
0 - 1 - 2 - 4 - 8 - 9 - 7
...
0 - 1 - 2 - 4 - 7 - 9 - 8
...
0 - 1 - 2 - 4 - 7 - 8 - 9
Complexidade
O selection sort compara a cada interação um elemento com os outros, visando encontrar o menor. Dessa forma, podemos entender que não existe um melhor caso mesmo que o vetor esteja ordenado ou em ordem inversa serão executados os dois laços do algoritmo, o externo e o interno. A complexidade deste algoritmo será sempre enquanto que, por exemplo, os algoritmos heapsort e mergesort possuem complexidades
Vantagens
Ele é um algoritmo simples de ser implementado em comparação aos demais.
Não necessita de um vetor auxiliar (in-place).
Por não usar um vetor auxiliar para realizar a ordenação, ele ocupa menos memória.
Ele é uns dos mais velozes na ordenação de vetores de tamanhos pequenos.
Desvantagens
Ele é um dos mais lentos para vetores de tamanhos grandes.
Ele não é estável.
Ele faz sempre comparações, independentemente do vetor estar ordenado ou não.
defselection_sort(lista):""" Ordena uma lista. Custo O(n²) """n=len(lista)# tamanho da listaifn==1:# caso basereturnlista[0]# Loop externo para iterar sobre os índices da listaforiinrange(n-1):menor=i# primeiro índice inicia como o menor# Loop interno para encontrar o índice do menor elementoforjinrange(i+1,n):iflista[j]<lista[menor]:menor=j# Se o elemento atual não é o menor, trocaiflista[i]!=lista[menor]:aux=lista[i]lista[i]=lista[menor]lista[menor]=auxreturnlista# USOlista_desordenada=[3,2,1]# Lista de números desordenadoslista_ordenada=selection_sort(lista_desordenada)# ordenaprint(lista_ordenada)# [1, 2, 3]