DAA - Classificação por Seleção
Este tipo de classificação é chamado Selection Sortcomo funciona, classificando elementos repetidamente. Funciona da seguinte forma: primeiro encontre o menor na matriz e troque-o pelo elemento na primeira posição, depois encontre o segundo menor elemento e troque-o pelo elemento na segunda posição e continue assim até que toda a matriz seja classificado.
Algorithm: Selection-Sort (A)
fori ← 1 to n-1 do
min j ← i;
min x ← A[i]
for j ←i + 1 to n do
if A[j] < min x then
min j ← j
min x ← A[j]
A[min j] ← A [i]
A[i] ← min x
A classificação por seleção está entre as técnicas de classificação mais simples e funciona muito bem para arquivos pequenos. Tem uma aplicação muito importante, pois cada item é movido no máximo uma vez.
A classificação por seção é um método de escolha para classificar arquivos com objetos muito grandes (registros) e chaves pequenas. O pior caso ocorre se a matriz já estiver classificada em ordem decrescente e quisermos classificá-la em ordem crescente.
No entanto, o tempo exigido pelo algoritmo de classificação de seleção não é muito sensível à ordem original da matriz a ser classificada: o teste se A[j] < min x é executado exatamente o mesmo número de vezes em todos os casos.
A classificação por seleção passa a maior parte do tempo tentando encontrar o elemento mínimo na parte não classificada da matriz. Mostra claramente a semelhança entre a classificação por seleção e a classificação por bolha.
A classificação por bolha seleciona o máximo de elementos restantes em cada estágio, mas desperdiça algum esforço ao transmitir alguma ordem a uma parte não classificada da matriz.
A classificação por seleção é quadrática no pior caso e no caso médio e não requer memória extra.
Para cada i de 1 para n - 1, há uma troca e n - i comparações, então há um total de n - 1 trocas e
(n − 1) + (n − 2) + ...+ 2 + 1 = n(n − 1)/2 comparações.
Essas observações são válidas, não importa quais sejam os dados de entrada.
No pior caso, isso poderia ser quadrático, mas no caso médio, essa quantidade é O(n log n). Isso implica que orunning time of Selection sort is quite insensitive to the input.
Implementação
Void Selection-Sort(int numbers[], int array_size) {
int i, j;
int min, temp;
for (i = 0; I < array_size-1; i++) {
min = i;
for (j = i+1; j < array_size; j++)
if (numbers[j] < numbers[min])
min = j;
temp = numbers[i];
numbers[i] = numbers[min];
numbers[min] = temp;
}
}
Exemplo
Unsorted list: |
|
1 r iteração:
Menor = 5
2 <5, menor = 2
1 <2, menor = 1
4> 1, menor = 1
3> 1, menor = 1
Troca 5 e 1 |
|
2 nd iteração:
Menor = 2
2 <5, menor = 2
2 <4, menor = 2
2 <3, menor = 2
Sem troca |
|
3 rd iteração:
Menor = 5
4 <5, menor = 4
3 <4, menor = 3
Troca 5 e 3 |
|
4 th iteração:
Menor = 4
4 <5, menor = 4
Sem troca |
|
Finalmente,
the sorted list is |
|