Selection Sort
O Selection Sort é uma melhoria do Bubblesort, é um algoritmo de ordenação simples que divide a lista de entrada em duas partes: a sublista de itens já ordenados, que é construída da esquerda para a direita na frente (ou no topo) da lista, e a sublista de itens restantes a serem ordenados que ocupam o resto da lista. Inicialmente, a sublista ordenada está vazia e a sublista não ordenada é a lista inteira.
Funcionamento do Algoritmo¶
O algoritmo funciona repetidamente encontrando o menor (ou maior, dependendo da ordem de ordenação) elemento na sublista não ordenada, trocando-o com o elemento não ordenado mais à esquerda (ou seja, colocando-o na posição correta na sublista ordenada) e movendo a fronteira da sublista ordenada um elemento para a direita.
Selection Sort em ação¶
Para visualizar o algoritmo em ação utilize o link a seguir:
ttps://visualgo.net/en/sorting
Implementação em Python¶
Aqui está uma implementação simples do Selection Sort em Python:
def selection_sort(lista):
n = len(lista)
# Percorre a lista.
for i in range(n):
# Encontra o elemento mínimo da lista.
minimo = i
for j in range(i + 1, n):
if lista[minimo] > lista[j]:
minimo = j
# Coloca o elemento mínimo na posição correta.
lista[i], lista[minimo] = lista[minimo], lista[i] ## troca de posição
Uma variação possivel é modificar o algoritmo para ordenar colocando os maiores elementos no final, você precisaria procurar o maior elemento na sublista não ordenada em vez do menor. Isso pode ser feito alterando a condição de comparação no loop interno para if lista[idx] < lista[j]:
. No entanto, na prática, isso não muda a essência do algoritmo; apenas inverte a ordem de ordenação.
def selection_sort(lista):
n = len(lista)
# Percorre a lista.
for i in range(n):
# Encontra o elemento máximo da lista.
maximo = i
for j in range(i + 1, n):
if lista[maximo] < lista[j]:
maximo = j
# Coloca o elemento máximo na posição correta.
lista[i], lista[maximo] = lista[maximo], lista[i]
return lista
Neste caso, como exemplo:
lista = [64, 25, 12, 22, 11]
lista_ordenada = selection_sort(lista)
print("Lista Ordenada:", lista_ordenada)
Intuição da Análise de Complexidade¶
-
Complexidade de Tempo: O Selection Sort tem uma complexidade de tempo quadrática O(n²), onde n é o número de elementos na lista. Isso ocorre porque ele precisa fazer duas passagens aninhadas sobre a lista para garantir que ela esteja ordenada.
-
Complexidade de Espaço: A complexidade de espaço é O(1), pois requer apenas uma quantidade constante de espaço de memória adicional além da lista de entrada.
Exercício de Ordenação
Suponha que você tenha a seguinte lista de números para ordenar: [11, 7, 12, 14, 19, 1, 6, 18, 8, 20]
qual lista representa a lista parcialmente ordenada depois de três passagens completas da ordenação por seleção,assumindo que vai buscar o maior elemento na sublista não ordenada em vez do menor?
- [7, 11, 12, 1, 6, 14, 8, 18, 19, 20]
- [7, 11, 12, 14, 19, 1, 6, 18, 8, 20]
- [11, 7, 12, 14, 1, 6, 8, 18, 19, 20]
- [11, 7, 12, 14, 8, 1, 6, 18, 19, 20]
Answer
A lista parcialmente ordenada depois de três passagens buscando o maior elemento na sublista não ordenada em vez do menor. [11, 7, 12, 14, 8, 1, 6, 18, 19, 20]
.
Referência: https://panda.ime.usp.br/panda/static/pythonds_pt/05-OrdenacaoBusca/AOrdenacaoPorSelecao.html