Merge Sort
O algoritmo Merge Sort é um algoritmo de classificação baseado no paradigma Divide and Conquer . Nesse algoritmo, a matriz é inicialmente dividida em duas metades iguais e, em seguida, elas são combinadas de maneira ordenada.
Processo de trabalho de classificação de mesclagem:
Pense nisso como um algoritmo recursivo que divide continuamente a matriz ao meio até que ela não possa mais ser dividida. Isso significa que se a matriz ficar vazia ou tiver apenas um elemento restante, a divisão será interrompida, ou seja, é o caso básico para interromper a recursão. Se a matriz tiver vários elementos, divida a matriz em metades e invoque recursivamente a classificação por mesclagem em cada uma das metades. Finalmente, quando ambas as metades são classificadas, a operação de mesclagem é aplicada. A operação de mesclagem é o processo de pegar duas matrizes classificadas menores e combiná-las para eventualmente criar uma maior.
Como tudo funciona
Mãos a obra:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class MergeSort {
public static void main(String[] args) {
Scanner leia = new Scanner(System.in);
ArrayList lista = new ArrayList<>();
int cont = 1;
for (int i = 0; i < 1000; i++) {
Random rand = new Random();
int n = rand.nextInt(1000);
lista.add(n);
}
MergeSort(lista, 0, lista.size() - 1);
for (Integer integer : lista) {
System.out.print(integer + ", ");
if (cont % 20 == 0) {
System.out.println();
}
cont++;
}
}
/* ---------------------- Algoritimo De Ordenação ---------------------- */
public static void popula(int tot, ArrayList lista2) {
for (int i = 0; i < tot; i++) {
lista2.add(0);
}
}
public static void MergeSort(ArrayList lista, int a, int z) {
int m;
if (a < z) {
m = (a + z) / 2;
MergeSort(lista, a, m);
MergeSort(lista, m + 1, z);
intercala(lista, a, m, z);
}
}
public static void intercala(ArrayList lista, int a, int m, int z) {
int poslivre, iniL1, iniL2, i;
ArrayList lista2 = new ArrayList<>();
popula(lista.size(), lista2);
iniL1 = a;
iniL2 = m + 1;
poslivre = a;
while (iniL1 <= m && iniL2 <= z) {
if (lista.get(iniL1) <= lista.get(iniL2)) {
lista2.set(poslivre, lista.get(iniL1));
iniL1++;
} else {
lista2.set(poslivre, lista.get(iniL2));
iniL2++;
}
poslivre++;
}
for (i = iniL1; i <= m; i++) {
lista2.set(poslivre, lista.get(i));
poslivre++;
}
for (i = iniL2; i <= z; i++) {
lista2.set(poslivre, lista.get(i));
poslivre++;
}
for (i = a; i <= z; i++) {
lista.set(i, lista2.get(i));
}
}
}
Tempo de execução(em segundos) VS Qtd de nº no Array:
Merge Sort | 1.000 | 10.000 | 500.000 | 1.000.000 |
---|---|---|---|---|
Bom | 0.0597083 | 1.1589879 | 2103.9774235 | 10905.2476831 |
Médio | 0.0263602 | 1.0561847 | 2135.3927107 | 10638.8583866 |
Ruim | 0.0105934 | 0.8276113 | 2082.6098942 | 12852.540375 |
*A tabela representa a quantidade de numros utilizadas e o tempo de execução o processo de ordenação