Seleção Classificar em Java
1. Introdução
Neste tutorial, vamoslearn Selection Sort, ver sua implementação em Java e analisar seu desempenho.
2. Visão Geral do Algoritmo
Seleção Classificabegins with the element in the 1st position of uma matriz não classificada e examina os elementos subsequentes atéfind the smallest element. Uma vez encontrado, o menor elemento é trocado pelo elemento na posição de 1st.
O algoritmo então passa para o elemento na posição 2nde varre os elementos subsequentes para encontrar o índice do menor elemento 2nd. Uma vez encontrado, o segundo menor elemento é trocado pelo elemento na posição 2nd.
Esse processo continua até atingirmos o elemento n-1th da matriz, que coloca o menor elemento n-1th na posição n-1th. O último elemento se encaixa automaticamente, na iteração n-1th, classificando assim a matriz.
Encontramosthe largest element instead of the smallest element to sort the array in descending order.
Vamos ver um exemplo de uma matriz não classificada e classificá-la em ordem crescente para entender visualmente o algoritmo.
2.1. Um exemplo
Considere a seguinte matriz não classificada:
int [] arr = \ {5, 4, 1, 6, 2}
Iteração 1
Considerando o funcionamento do algoritmo acima, começamos com o elemento na posição 1st - 5 - e examinamos todos os elementos subsequentes para encontrar o menor elemento - 1. Em seguida, trocamos o menor elemento pelo elemento na posição de 1st.
A matriz modificada agora se parece com:
\ {1, 4, 5, 6, 2}
Total de comparações realizadas: 4
Iteração 2
Na segunda iteração, passamos para o elemento 2nd - 4 - e examinamos os elementos subsequentes para encontrar o segundo menor elemento - 2. Em seguida, trocamos o segundo menor elemento com o elemento na posição 2nd.
A matriz modificada agora se parece com:
\ {1, 2, 5, 6, 4}
Total de comparações realizadas: 3
Continuando da mesma forma, temos as seguintes iterações:
Iteração 3
\ {1, 2, 4, 6, 5}
Total de comparações realizadas: 2
Iteração 4
\ {1, 2, 4, 5, 6}
Total de comparações realizadas: 1
3. Implementação
Vamos implementar a classificação por seleção usando alguns loopsfor:
public static void sortAscending(final int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minElementIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minElementIndex] > arr[j]) {
minElementIndex = j;
}
}
if (minElementIndex != i) {
int temp = arr[i];
arr[i] = arr[minElementIndex];
arr[minElementIndex] = temp;
}
}
}
Obviamente, para reverter isso, poderíamos fazer algo bastante semelhante:
public static void sortDescending(final int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int maxElementIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[maxElementIndex] < arr[j]) {
maxElementIndex = j;
}
}
if (maxElementIndex != i) {
int temp = arr[i];
arr[i] = arr[maxElementIndex];
arr[maxElementIndex] = temp;
}
}
}
E com um pouco mais de graxa de cotovelo, poderíamos combiná-los usandoComparators.
4. Visão Geral do Desempenho
4.1. Time
No exemplo que vimos anteriormente,selecting the smallest element required a total of (n-1) comparisons é seguido pela troca para a posição de 1st. Da mesma forma, as comparações deselecting the next smallest element required total (n-2) seguidas de troca na posição de 2nd e assim por diante.
Assim, a partir do índice 0, fazemos comparações den-1, n-2, n-3, n-4 …. 1. O último elemento cai automaticamente no lugar devido a iterações e trocas anteriores.
Matematicamente, osum of the first n-1 natural numbers nos dirá quantas comparações precisamos para classificar uma matriz de tamanhon usando a Classificação por Seleção.
A fórmula para a soma dos números naturais den é n(n+1)/2.
Em nosso caso, precisamos da soma dos primeirosn-1 números naturais. Portanto, substituímosn porn-1 na fórmula acima para obter:
(n-1)(n-1+1)/2 = (n-1)n/2 = (n^2-n)/2
À medida quen^2 cresce de forma proeminente à medida quen cresce, consideramos o poder superior den como o benchmark de desempenho, fazendo com que este algoritmo tenha umtime complexity of O(n^2).
4.2. Espaço
Em termos de complexidade de espaço auxiliar, Selection Sort requer uma variável extra para conter o valor temporariamente para troca. Portanto,space complexity is O(1). de classificação por seleção
5. Conclusão
A classificação por seleção é um algoritmo de classificação muito simples de entender e implementar. Infelizmente,its quadratic time complexity makes it an expensive sorting technique. Além disso, como o algoritmo deve varrer cada elemento,the best case, average case, and worst-case time complexity is the same.
Outras técnicas de classificação comoInsertion Sort eShell Sort também têm complexidade de tempo de pior caso quadrático, mas têm um desempenho melhor nos casos melhores e médios.
Verifique o código completo para Selection Sortover on GitHub.