Introdução aos algoritmos de classificação de mesclagem em Java

Os algoritmos de classificação por mesclagem são muito importantes em ciência da computação. A saída da classificação é organizar os elementos de uma lista em certa ordem (crescente ou decrescente). A classificação por mesclagem é um dos algoritmos de classificação mais eficientes disponíveis, pois se baseia no conceito de divisão e conquista. Como o nome sugere, primeiro divida o problema maior em problemas pequenos do que resolva os problemas menores para resolver o problema maior. Neste artigo, discutiremos os algoritmos de classificação de mesclagem em Java. Conceitualmente, a classificação Merge é uma combinação de dois algoritmos básicos chamados MERGE e MERGE_SORT, que funciona da seguinte maneira:

  1. Divida a lista não classificada em n número de sub-listas de item único (n é o número total de elementos na lista não classificada).
  2. Mesclar sublistas repetidamente em sublistas classificadas até que haja apenas uma lista classificada.

Implementação de algoritmos de classificação de mesclagem em Java

O algoritmo MERGE é o procedimento de combinar duas listas classificadas em uma lista classificada.

Exemplo: Suponha que haja duas listas, ou seja, Lista 1 (6, 3) e Lista 2 (3, 1, 9).

1. Primeiro, classifique as duas listas.

Lista 1

Lista 2

Agora, aplicaremos uma técnica de mesclagem.

  1. Em seguida, criaremos uma nova lista de tamanho m + n em que m é o número de elementos na Lista 1 en é o número de elementos na Lista 2.

Lista 3

No nosso caso, m = 2 en = 3, então m + n = 5.

  1. Agora, temos um ponteiro de dois. Um primeiro ponteiro apontando para a primeira posição da lista 1 e o segundo ponteiro apontando para a primeira posição da lista 2.

4. Em seguida, compararemos o valor dos dois ponteiros. O ponteiro com menor valor, copie esse elemento na Lista 3 e mova o ponteiro para a direita da lista com valor menor e a lista resultante (por exemplo, Lista 1 e Lista 3).

5. Da mesma forma, execute a etapa 4 novamente e novamente.

Travessia adicional …

NOTA: Se uma das listas (por exemplo, lista 1 ou lista 2) for totalmente percorrida como no caso acima, copie todo o conteúdo de outras listas do ponteiro para a lista de resultados (por exemplo, lista 3) da seguinte maneira.

Algoritmo e Pseudocódigo

Os dois algoritmos usados ​​no algoritmo de mesclagem são:

  • O MERGE (ARR, F, M, L) é um processo que assume o seguinte:
  1. ARR (F… .M) e ARR (M + 1… .L) são listas ordenadas.
  2. Mescla as duas sub-listas classificadas em um ARR (F… .L).
  • SORT (ARR (), F, L) // aqui F é o primeiro e L é o último índice da matriz.

Se (L> 1)

  1. Encontre o ponto do meio para dividir a lista em duas metades:

meio M = (F + L) / 2

  1. Classificação de mesclagem de chamadas para o primeiro semestre:

Ligue para SORT (ARR, 1, M)

  1. Classificação de mesclagem de chamadas para o segundo semestre:

Chamar SORT (ARR, M + 1, L)

  1. Mesclar as metades classificadas na etapa 2 e 3:

Ligue para MERGE (ARR, L, M, R)

Exemplo

Vamos dar um exemplo de uma matriz ARR (10, 6, 8, 5, 7, 3, 4). Usaremos o algoritmo de mesclagem para classificar a matriz usando sua técnica de divisão e conquista. Podemos ver a figura abaixo: a matriz é dividida recursivamente em duas metades até o tamanho se tornar 1. Depois que o tamanho se torna 1, chamamos processos de mesclagem e começamos a mesclar as listas até a lista completa ser mesclada.

NOTA: Na figura abaixo, os números em vermelho indicam a ordem na qual as etapas são processadas para formar a matriz classificada.

Código do Programa:

import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)
import java.util.Scanner;
public class mergeSort (
// merges two sublists of arr().
// first list is arr(l..m) // second list is arr(m+1..r) void mergeAlgo(int arr(), int l, int m, int r)
(
// find the sizes of two lists to be merged
int n1 = m - l + 1;
int n2 = r - m;
// create temp array
int L() = new int (n1);
int R() = new int (n2);
// copy data to temp arrays
for (int i=0; i L(i) = arr(l + i);
for (int j=0; j R(j) = arr(m + 1+ j);
/* merge the temp arrays */
// initial indexes of first and second list
int i = 0, j = 0;
// initial index of merged sub list
int k = l;
while (i < n1 && j < n2)
(
if (L(i) <= R(j))
(
arr(k) = L(i);
i++;
)
else
(
arr(k) = R(j);
j++;
)
k++;
)
// copy remaining elements of L() if any
while (i < n1)
(
arr(k) = L(i);
i++;
k++;
)
// copy remaining elements of R() if any
while (j < n2)
(
arr(k) = R(j);
j++;
k++;
)
)
// main function that sorts arr(l..r) using mergeAlgo()
void sort(int arr(), int l, int r)
(
if (l < r)
(
// find the middle index
int m = (l+r)/2;
// sort first and second halves
sort(arr, l, m);
sort(arr, m+1, r);
// merge the above two sorted halves
mergeAlgo(arr, l, m, r);
)
)
/* A function to print list of size n */
static void printArray(int arr())
(
int n = arr.length;
for (int i=0; i System.out.print(arr(i) + " ");
System.out.println();
)
public static void main(String args())
(
Scanner myObj = new Scanner(System.in);
System.out.println("Enter the size of list:");
int N = myObj.nextInt();
System.out.println("Enter the elements in list separated by space:");
int arr() = new int(N);
for(int i=0; i arr(i) = myObj.nextInt();
)
mergeSort mg = new mergeSort();
mg.sort(arr, 0, arr.length-1);
System.out.println("\nSorted list:");
printArray(arr);
)
)

Resultado:

Conclusão - Mesclar algoritmos de classificação em Java

Mesclar melhor, as piores e as complexidades de tempo médio são as mesmas, o que o torna um algoritmo mais eficiente. Funciona mais rápido que outras técnicas de classificação. A classificação de mesclagem pode ser aplicada a arquivos de qualquer tamanho. É altamente paralelamente devido ao uso do método de dividir e conquistar. Para desenvolver conceitos básicos sólidos em ciência da computação, é aconselhável que você compreenda completamente os diferentes algoritmos de classificação.

Artigos recomendados

Este é um guia para mesclar algoritmos de classificação em Java. Aqui discutimos Implementação de algoritmos de classificação de mesclagem em java e Algorithm & Pseudocode com exemplo. Você também pode consultar nossos outros artigos sugeridos -

  1. Seleção Classificar em Java
  2. Declaração de caso em Java
  3. Modificadores de acesso em Java
  4. Mesclar Classificar em JavaScript
  5. O que é declaração de caso em JavaScript?
  6. Modificadores de acesso em PHP
  7. Algoritmos de classificação rápida em Java
  8. Guia completo para classificação em c # com exemplos
  9. Função de classificação em Python com exemplos
  10. Os 6 principais algoritmos de classificação em JavaScript