Selection Sort - Algoritmo de ordenação por seleção
1. 1. para i 1
até tamanho-1,
faça
2. minimo
i
3. para j
i+1 até
tamanho, faça
4. se
vetor[j] <
vetor[minimo],
então
5.
minimo j
6. fim-se
7. fim-par
8. temp
vetor[i]
9. vetor[i] vetor[minimo]
10. vetor[minimo] temp
11. fim-para
tamanho = comprimento do vetor
Funcionamento
A idéia é sempre procurar o menor elemento do vetor e inseri-lo no início do vetor.
Procuramos o menor valor do vetor e colocamos ele em vetor[1]. Procuramos o menor
valor do vetor excluindo o já colocado e colocamos ele em vetor[2]. E assim vamos
indo até termos todo o vetor ordenado.
Partindo sempre a partir do último elemento reordenado (a partir do i), o programa
procura o menor elemento no vetor e o substitue pelo elemento i atual.
Exemplo de Funcionamento
O programa recebe o seguinte vetor.
v[1] v[2] v[3] v[4] v[5] v[6]
5 3 7 8 2 5
Aí ele começa com . Vou sempre marcar com a cor preta e com a cor cinza.
v[1] v[2] v[3] v[4] v[5] v[6]
5 3 7 8 2 5
Ele marca o próprio índice i como a variável minimo, que é sempre o menor elemento
do vetor. Então, ele faz um para de até o comprimento do vetor, com o objetivo
de descobrir qual o menor elemento.
… ... , portanto não mexemos em nada.
... , portanto não mexemos em nada.
2. ... ... , portanto não mexemos em nada.
Agora substituímos o v[minimo] pelo v[i], formando com isto o novo vetor:
v[1] v[2] v[3] v[4] v[5] v[6]
2 3 7 8 5 5
E assim vamos fazendo com os outros elementos até que todo o vetor esteja ordenado.
Custo
Este algoritmo não tem um melhor/pior caso, porque todos os elementos são varridos,
sempre. Medir seu custo é simples. Custo de linha por linha...
n = tamanho do vetor
1.
2.
3.
4.
5. ???
6.
7.
8.
9.
10.
11.
Você pode estar se perguntando porque eu coloquei este custo para a linha 5. Afinal, a
linha 5 diria que este programa tem um melhor/pior caso, porque ela não seria
executada se o se retornar falso. Mas o caso é que ela é desprezível. Uma soma como
estas para o custo geral do nosso algoritmo não vai influenciar em nada. Quer ver?
Vamos somar os custos com esta linha valendo (como se nenhum se entrasse) e depois
com ela valendo .
Selection Sort
Este algoritmo é baseado em se passar sempre o menor valor do vetor para a primeira
posição (ou o maior dependendo da ordem requerida), depois o segundo menor valor
para a segunda posição e assim sucessivamente, até os últimos dois elementos.
Neste algoritmo de ordenação é escolhido um número a partir do primeiro, este número
escolhido é comparado com os números a partir da sua direita, quando encontrado um
3. número menor, o número escolhido ocupa a posição do menor número encontrado. Este
número encontrado será o próximo número escolhido, caso não for encontrado nenhum
número menor que este escolhido, ele é colocado na posição do primeiro número
escolhido, e o próximo número à sua direita vai ser o escolhido para fazer as
comparações. É repetido esse processo até que a lista esteja ordenada.
Figura 3: Esquema de funcionamento do Selection Sort
• Neste passo o primeiro número escolhido foi o 3, ele foi comparado com todos
os números à sua direita e o menor número encontrado foi o 1, então os dois
trocam de lugar.
• O mesmo processo do passo 1 acontece, o número escolhido foi o 5 e o menor
número encontrado foi o 2.
• Não foi encontrado nenhum número menor que 3, então ele fica na mesma
posição.
• O número 5 foi escolhido novamente e o único número menor que ele à sua
direita é o 4, então eles trocam.
• Vetor já ordenado.
Esta seção trata de outro algoritmo de ordenação bem conhecido. (Veja o verbete
Selection sort na Wikipedia.) Ele usa a seguinte estratégia: seleciona o menor elemento
do vetor, depois o segundo menor, depois o terceiro menor, e assim por diante:
// Esta função rearranja o vetor v[0..n-1] em
// ordem crescente.
void
selecao (int n, int v[])
{
4. int i, j, min, x;
for (i = 0; i < n-1; ++i) {
min = i;
for (j = i+1; j < n; ++j)
if (v[j] < v[min]) min = j;
x = v[i]; v[i] = v[min]; v[min] = x;
}
}
Para entender por que o algoritmo está correto, basta observar que no início de cada
repetição do for externo, imediatamente antes da comparação de i com n-1, valem os
seguintes invariantes:
1. o vetor v[0..n-1] é uma permutação do vetor original,
2. v[0..i-1] está em ordem crescente e
3. v[i-1] ≤ v[i..n-1].
A tradução do terceiro invariante para linguagem humana é a seguinte: v[0..i-1]
contém todos os elementos pequenos do vetor original e v[i..n-1] contém todos os
elementos grandes. Os três invariantes garantem que no início de cada iteração v[0], . .
, v[i-1] já estão em suas posições definitivas.
0 crescente i-1 i
110 120 120 130 140 999 666 999 666 999
pequenos grandes
Selection sort
O selection sort vasculha repetidamente a lista de itens, selecionando um elemento de
cada vez e colocando-o na posição correta da sequência. A principal vantagem do
selection sort é que ela funciona bem em uma lista pequena. Além disso, por ser um
algoritmo de ordenação de local, não precisa de armazenamento temporário além do
necessário para guardar a lista original. A principal desvantagem é sua baixa eficiência
em listas grandes. Assim como o bubble sort, ele exige n² números de passos para cada
n elementos. Adicionalmente, o seu desempenho é facilmente influenciado pela ordem
inicial dos itens antes do processo de triagem. Devido a isso, esse tipo seleção é
adequado apenas para uma lista em que poucos elementos estejam em ordem aleatória.
http://www.decom.ufop.br/menotti/aedI082/tps/tp3-sol1.pdf
http://tiagomadeira.com/2006/01/ordenacao-por-selecao/
http://www.devmedia.com.br/algoritmos-de-ordenacao-analise-e-comparacao/28261
http://professor.ufabc.edu.br/~jesus.mena/courses/bc0505-1q-2013/slides-aulas/teoria-
semana09-01-ordenacao.pdf
http://www.univasf.edu.br/~marcelo.linder/arquivos_aed2/aulas/aula12.pdf