Selection sort.
O algoritmo consiste em selecionar o menor (ou maior) elemento fora de ordem colocá-lo em sua posição correta. Para fazer isso, primeiro os elementos devem ser divididos em duas partes: os elementos já ordenados e os elementos que ainda não foram ordenados.
Inicialmente a parte ordenada estará vazia, enquanto a parte não ordenada possuirá todos os elementos.
Após a divisão, o algoritmo irá encontrar o menor elemento do lado não ordenado e colocá-lo no lado ordenado. Esse passo irá se repetir até que o lado não ordenado fique vazio.
Este algoritmo possui duas grandes vantagens, primeiro, é um algoritmo simples de ser implementado e segundo, não há consumo de memória além daquele já alocado para os elementos originais, uma vez que a divisão de lado ordenado e lado não ordenado é feita no próprio vetor que queremos ordenar.
A maior desvantagem é que é um algoritmo que não tem um bom desempenho quando temos uma quantidade de elementos muito grande.
public class SelectionSort {
public static void ordenar(int arr[]) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int min = i;
for (int j = i + 1; j < n; j++)
if (arr[j] < arr[min])
min = j;
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
public static void main(String args[]) {
int arr[] = { 64, 25, 12, 22, 11 };
System.out.println("Antes de ordenar");
imprimir(arr);
ordenar(arr);
System.out.println("Depois de ordenar");
imprimir(arr);
}
public static void imprimir(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}
Insertion sort
O algoritmos consiste inicialmente em selecionar um pivô e comparar os elementos seguintes, um a um. Se o elemento seguinte for maior que o pivô, esse elemento agora passará a ser o novo pivô. Se o elemento for menor que o pivô, os elementos anteriores ao pivô serão percorridos até ser encontrado o elemento maior que o elemento encontrado anteriormente colocando-o logo antes do elemento maior.
Este algoritmo possui uma vantagem: não há consumo de memória além daquele já alocado para os elementos originais, uma que toda a ordenação ocorre dentro dos próprios elementos.
A maior desvantagem é que é um algoritmo que não tem um bom desempenho quando temos uma quantidade de elementos muito grande, assim como o selection sort.
public class InsertionSort {
public static void sort(int arr[]) {
int n = arr.length;
for (int i = 1; i < n; ++i) {
int k = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > k) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = k;
}
}
public static void main(String args[]) {
int arr[] = { 12, 11, 13, 5, 6 };
System.out.println("Antes de ordenar");
imprimir(arr);
sort(arr);
System.out.println("Depois de ordenar");
imprimir(arr);
}
public static void imprimir(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}
Shell sort
Este algoritmo consiste em realizar trocas entre os elementos que estão posicionados a uma distância determinada. A distância inicial pode ser definida por d = n / 2 e a cada iteração diminuímos a essa distância, por exemplo, se você tem 10 elementos
iteração 1) d = 10 / 2 = 5;
iteração 2) d = 5 / 2 = 3;
iteração 3) d = 3 / 2 = 2
iteração 4) d = 2 / 2 = 1
Os elementos estarão ordenados quando a distância for menor ou igual a zero.
public class ShellSort {
public static int ordenar(int arr[]) {
int n = arr.length;
for (int gap = n / 2; gap > 0; gap /= 2) {
for (int i = gap; i < n; i += 1) {
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
arr[j] = arr[j - gap];
arr[j] = temp;
}
}
return 0;
}
public static void main(String args[]) {
int arr[] = { 12, 34, 54, 2, 3 };
System.out.println("Antes de ordenar");
imprimir(arr);
ordenar(arr);
System.out.println("Depois de ordenar");
imprimir(arr);
}
public static void imprimir(int arr[]) {
int n = arr.length;
for (int i = 0; i < n; ++i)
System.out.print(arr[i] + " ");
System.out.println();
}
}






Nenhum comentário:
Postar um comentário