Você está na página 1de 13

Ordenação por Seleção -

Selection Sort
Evandro Mafort, Gabriel Rodrigues, Lorran Fernandes da C. Parreira
Afinal, o que é o Selection Sort?
A Ordenação por Seleção, ou Selection Sort, é um dos algoritmos mais simples para utilizarmos ao ordenar
listas de elementos, em qualquer linguagem.

Descrição do funcionamento:

O algoritmo é composto por 2 laços for. O primeiro é responsável por cuidar do índice inicial e o segundo por
percorrer o vetor. Inicialmente, o primeiro laço inicializa o índice com o valor 0 e é adicionado 1 unidade a cada
iteração. Já o segundo percorre o vetor começando do índice inicial + 1 afim de achar um elemento que seja
menor que o presente na posição inicial, caso tenha.

A seguir um exemplo para melhor compreensão:


Afinal, o que é o Selection Sort?
O índice inicial é 0 e o laço mais interno começa da posição 1 (índice inicial + 1) e percorre o vetor atéachar o
menor elemento, neste caso o número zero. Assim, pelo fato dos dois índices serem diferentes, o zero
troca de posição com o elemento nove.

Após o término do segundo laço, 1 unidade é incrementada ao primeiro laço e o loop mais interno começa
do índice 2. Dito isso, o processo de comparações é iniciado e o elemento um troca de posição com o
elemento sete após ser verificado que ele é o segundo menor número.
Afinal, o que é o Selection Sort?
Continuando o mesmo procedimento, 1 unidade é incrementada ao primeiro laço e o loop mais interno
começa do índice 3. Como resultado, encontramos o menor elemento no índice 4, o qual troca de posição
com o elemento no índice 2.

Mais 1 unidade é incrementada ao primeiro laço e o loop mais interno começa do índice 4. Após
comparações, o quarto menor elemento é encontrado no último índice e troca de posição com o elemento
sete.

Mais 1 unidade é incrementada ao primeiro laço e o loop mais interno começa do índice 5. Finalizado o for, o
menor elemento encontrado é o 7, o qual muda de posição com o elemento 8.
Afinal, o que é o Selection Sort?
Mais 1 unidade é incrementada ao primeiro laço e o loop mais interno começa do índice 6. Como conclusão,
o menor elemento restante é o 8, o qual muda de posição com o elemento 9, o maior deste vetor.

Consequentemente, podemos calcular o número de comparações que ocorreram a partir do seguinte


cálculo: (n2 – n) / 2 e de movimentações considerando que sempre ocorre 2 vezes dentro de uma troca.
Dessa forma, os valores 21 e 12 são obtidos.
QUEM CRIOU O SELECTION SORT?

Como surgiu o Como não há um nome em específico para determinar como O criador do
Selection Sort, mas apenas registros de uso ou desenvolvimento da ideia
de forma aplicada, podemos citar o trabalho do engenheiro Herman

Selection Sort?
Hollerith (um dos fundadores da IBM), que nos anos 20 criou uma forma de
poder ordenar dados do Censo americano – dado o volume titânico de
informação e a quantidade de tempo homérica pra execução da atividade –
por fim criando uma máquina que pudesse fazer essa tarefa de ordenação
dos dados.
A história da criação e desenvolvimento
Passadas algumas décadas, já dentro da computação, talvez a descrição
do Selection Sort é um tanto quanto mais importante (e uma das primeiras, senão a primeira) seja a de Donald
nebulosa. Se olhamos a simplicidade do Knuth, cientista da computação e ganhador do Prêmio Turing de 1974, que
descreve o algoritmo em detalhes, seus usos, vantagens, desvantagens e
algoritmo, podemos inferir que a criação complexidade, no primeiro volume de sua obra de quatro livros, The Art Of
do mesmo se deu antes da criação dos Computer Programming – publicado primeiramente em 1968.

computadores como entendemos ele,


dada a sua simplicidade estrutural em
ordenar conjuntos de coisas em ordem
(seja ela crescente ou decrescente).
Qual é a complexidade do Selection
Sort?
A complexidade do Selection Sort pode ser entendida da seguinte forma:

O algoritmo em questão utiliza dois laços for: O laço i – O(n) – e o laço j – O(n).

Matematicamente, temos:
O(n) * O(n) = O(n*n) = O(N²)

Portanto, a complexidade do Selection Sort é O(N²).

Podemos também estender a compreensão da complexidade para a variável auxiliar – na hora da troca de valores – como O(1)
e, além disso, outro dado que tange a complexidade do Selection Sort é que a complexidade nunca passa de O(n) passos, o
que o torna um algoritmo bom de ser usado quando a memória não pode ser desperdiçada.
Vantagens de utilizar Desvantagens de
Selection Sort? utilizar Selection Sort?
O algoritmo em questão é simples de entender O algoritmo possui complexidade O(n²). Ou
e implementar, sendo uma ótima escolha seja: Quanto maior for a estrutura, mais tempo
utilizá-lo para introduzir o conceito de de processamento irá levar.
processamento de dados. É impraticável utilizar esse algoritmo, por
Outra vantagem do Selection Sort é a
conta da quantidade de passos. Se um
quantidade de trocas de elementos, mantendo
dataset possui 1000 entradas, isso significa
a menor quantidade possível - com relação a
que o algoritmo irá fazer 999 comparações e
outros algoritmos de processamento - em
999 movimentações.
operações que trazem um custo grande de
O algoritmo em questão não é estável para
memória e processamento.
ordenar arrays com chaves iguais (por
exemplo, um array que apresente a forma
[4A,5,3,2,4B,1]).
Qual é a eficiência do Selection Sort?
Comparado a outros algoritmos que fazem a mesma tarefa, o Selection Sort leva a pior, por conta da sua complexidade
O(n²).

Ainda há uma certa vantagem em utilizar este algoritmo, por conta da quantidade de passos necessários e também se o
foco do uso for simplicidade na hora de escrever o código, mas deve-se evitá-lo quando se busca eficiência.

Outros algoritmos, como o Merge Sort, Quick Sort ou Heap Sort, que possuem complexidade O(n log n) ou até O(n) –
dependendo do caso. Mesmo o seu uso em um cenário de melhor caso não melhora as coisas, já que a quantidade de
memória gasta pode ser um entrave.
Exemplo de aplicação/implementação do algoritmo: Observações:

#include <stdio.h> 1. Diferente de outros códigos, neste foi


#include <stdlib.h> usado uma função responsável por
#include <time.h> preencher o vetor automaticamente afim de
facilitar a implementação de vetores com
#define tam 9 tamanhos variados.

void preencherVetor(int vetor[], int tamanho) { 2. srand(time(NULL)) é uma chamada de


função presente na biblioteca time.h e é
int i;
usada para inicializar a semente do gerador
for (i = 0; i < tamanho; i++) {
de números aleatórios e impedir que os
vetor[i] = (rand() % 9) + 1;
números sorteados sejam sempre os
}
mesmos.
}
void selectionSort(int vetor[], int tamanho, int *comparacoes, Descrição do funcionamento:
int *movimentacoes) {
int i, j, auxiliar, menor; O algoritmo é composto por 2 laços for. O
for (i = 0; i < tamanho - 1; i++) { primeiro é responsável por cuidar do índice
menor = i; inicial e o segundo por percorrer o vetor.
for (j = i + 1; j < tamanho; j++) { Inicialmente, o primeiro laço inicializa o
if (vetor[j] < vetor[menor]) índice com o valor 0 e é adicionado 1
menor = j; unidade a cada iteração. Já o segundo

*comparações +=1; percorre o vetor começando do índice


inicial + 1 afim de achar um elemento que
}
seja menor que o presente na posição
if (i != menor) {
inicial, caso tenha.
auxiliar = vetor[i];
vetor[i] = vetor[menor];
*movimentações +=1;
vetor[menor] = auxiliar;
*movimentações +=1;
}
}
}
int main() { Descrição do funcionamento:
int i, v[tam];
int movimentacoes = 0, comparacoes = 0; O algoritmo é composto por 2 laços for. O
srand(time(NULL)); primeiro é responsável por cuidar do índice
preencherVetor(v, tam); inicial e o segundo por percorrer o vetor.
printf("Vetor inicial:\t "); Inicialmente, o primeiro laço inicializa o
for (i = 0; i < tam; i++) índice com o valor 0 e é adicionado 1
printf("%d\t", v[i]); unidade a cada iteração. Já o segundo

selectionSort(v, tam, &comparacoes, &movimentacoes); percorre o vetor começando do índice


inicial + 1 afim de achar um elemento que
printf("\n\nVetor ordenado:\t ");
seja menor que o presente na posição
for (i = 0; i < tam; i++)
inicial, caso tenha.
printf("%d\t", v[i]);
printf("\nNumero de movimentacoes: %d\tNumero de
comparacoes: %d\n", movimentacoes, comparacoes);
return 0;
}
Bibliografia
https://www.geeksforgeeks.org/selection-sort/
https://www.geeksforgeeks.org/stable-selection-sort/
https://pt.slideshare.net/DanielArndtAlves/selection-sort-
25735943
https://link.springer.com/chapter/10.1007/978-3-540-77978-0_5

(todos os links acessados em 28/5/2023)

Você também pode gostar