Índice
- Introdução
- O que é ordenação por mesclagem em C++
- Abordagem Dividir e Conquistar
- Algoritmo de Classificação de Mesclagem
- Implementação de Merge Sort em C++
- Conclusão
1. Introdução
Os algoritmos de classificação na ciência da computação são usados para organizar os dados em ordem crescente ou decrescente. Existem vários algoritmos de classificação com propriedades distintas disponíveis. Merge sort é um dos métodos em C++ que pode classificar os arrays.
2. O que é Merge Sort em C++
A classificação por mesclagem usa a técnica de dividir e conquistar que pode organizar os elementos de uma matriz. Ele também pode classificar a lista de elementos em C++. Ele divide a entrada em duas metades, classifica cada metade independentemente e depois as mescla na ordem correta.
3. Abordagem Dividir e Conquistar
O algoritmo de ordenação aplica uma estratégia de dividir e conquistar, que envolve particionar a matriz de entrada em submatrizes menores, resolvê-las separadamente e, em seguida, mesclar os resultados para produzir uma saída classificada. No caso do merge sort, o array é recursivamente dividido em duas metades até que reste apenas um elemento em cada metade.
4. Algoritmo de Classificação de Mesclagem
O algoritmo de classificação por mesclagem consiste em duas etapas principais: dividir e mesclar. As etapas são as seguintes:
4.1 Dividir
O algoritmo de classificação por mesclagem segue uma estratégia de divisão e conquista para classificar elementos em uma matriz.
- A primeira etapa do algoritmo verificará os elementos da matriz. Se contiver um elemento, já é considerado classificado e o algoritmo retornará o mesmo array sem nenhuma alteração.
- Se a matriz contiver mais de um elemento, o algoritmo procederá para dividi-la em duas metades: a metade esquerda e a metade direita.
- O algoritmo de classificação por mesclagem é então aplicado recursivamente às metades esquerda e direita do array, dividindo-os efetivamente em subarrays menores e classificando-os individualmente.
- Esse processo recursivo continua até que os subarrays contenham apenas um elemento cada (conforme a etapa 1), ponto em que eles podem ser mesclados para produzir um array de saída final classificado.
4.2 Mesclar
Agora veremos os passos para mesclar os arrays:
- A primeira etapa do algoritmo de classificação por mesclagem envolve a criação de uma matriz vazia.
- O algoritmo procede então para comparar os primeiros elementos das metades esquerda e direita da matriz de entrada.
- O menor dos dois elementos é adicionado à nova matriz e, em seguida, removido de sua respectiva metade da matriz de entrada.
- As etapas 2-3 são repetidas até que uma das metades seja esvaziada.
- Quaisquer elementos restantes na metade não vazia são adicionados à nova matriz.
- A matriz resultante agora está totalmente classificada e representa a saída final do algoritmo de classificação por mesclagem.
5. Implementação de Merge Sort em C++
Para implementar o merge sort em C++, dois métodos diferentes são seguidos. A complexidade de tempo de ambos os métodos é equivalente, mas o uso de subarrays temporários é diferente.
O primeiro método para o merge sort em C++ usa dois subarrays temporários, enquanto o segundo usa apenas um. Vale a pena notar que o tamanho total dos dois subarrays temporários no primeiro método é igual ao tamanho do array original no segundo método, então a complexidade do espaço permanece constante.
Método 1 - Usando dois subarranjos temporários
Aqui está um exemplo de programa para classificação por mesclagem em C++ usando o Método 1, que usa dois subarrays temporários:
#includeusando namespace std ;
vazio fundir ( int arr [ ] , int eu , int m , int r )
{
int n1 = m - eu + 1 ;
int n2 = r - m ;
int eu [ n1 ] , R [ n2 ] ;
para ( int eu = 0 ; eu < n1 ; eu ++ )
eu [ eu ] = arr [ eu + eu ] ;
para ( int j = 0 ; j < n2 ; j ++ )
R [ j ] = arr [ m + 1 + j ] ;
int eu = 0 , j = 0 , k = eu ;
enquanto ( eu < n1 && j < n2 ) {
se ( eu [ eu ] <= R [ j ] ) {
arr [ k ] = eu [ eu ] ;
eu ++;
}
outro {
arr [ k ] = R [ j ] ;
j ++;
}
k ++;
}
enquanto ( eu < n1 ) {
arr [ k ] = eu [ eu ] ;
eu ++;
k ++;
}
enquanto ( j < n2 ) {
arr [ k ] = R [ j ] ;
j ++;
k ++;
}
}
vazio mergeSort ( int arr [ ] , int eu , int r )
{
se ( eu < r ) {
int m = eu + ( r - eu ) / 2 ;
mergeSort ( arr , eu , m ) ;
mergeSort ( arr , m + 1 , r ) ;
fundir ( arr , eu , m , r ) ;
}
}
int principal ( )
{
int arr [ ] = { 12 , onze , 13 , 5 , 6 , 7 } ;
int arr_size = tamanho de ( arr ) / tamanho de ( arr [ 0 ] ) ;
cout << 'O array dado é \n ' ;
para ( int eu = 0 ; eu < arr_size ; eu ++ )
cout << arr [ eu ] << ' ' ;
mergeSort ( arr , 0 , arr_size - 1 ) ;
cout << ' \n A matriz ordenada é \n ' ;
para ( int eu = 0 ; eu < arr_size ; eu ++ )
cout << arr [ eu ] << ' ' ;
retornar 0 ;
}
Neste programa, a função de mesclagem recebe três argumentos arr, l e r, que representam o array a ser classificado e mostram os índices do subarray que precisa ser mesclado. A função primeiro localiza os tamanhos dos dois subarrays a serem mesclados e, em seguida, cria dois subarrays temporários L e R para armazenar os elementos desses subarrays. Em seguida, compara os elementos em L e R e os mescla na matriz original chamada arr em ordem ascendente.
A técnica de dividir e conquistar é empregada pela função mergeSort para dividir o array em duas metades recursivamente até que haja apenas um elemento deixado de fora no subarray. Em seguida, mescla os dois subarrays em um subarray classificado. A função continua a mesclar os subarrays, a menos que classifique o array completo.
Na função principal, definimos um array arr com 6 elementos e chamamos a função mergeSort para classificá-lo. No final do código, a matriz classificada é impressa.
Método 2 - Usando um subarranjo temporário
Aqui está um programa de exemplo para classificação por mesclagem em C++ usando o Método 2, que usa um único subarray temporário:
#includeusando namespace std ;
vazio fundir ( int arr [ ] , int eu , int m , int r )
{
int eu , j , k ;
int n1 = m - eu + 1 ;
int n2 = r - m ;
// Cria subarrays temporários
int eu [ n1 ] , R [ n2 ] ;
// Copia dados para subarrays
para ( eu = 0 ; eu < n1 ; eu ++ )
eu [ eu ] = arr [ eu + eu ] ;
para ( j = 0 ; j < n2 ; j ++ )
R [ j ] = arr [ m + 1 + j ] ;
// Mescla os subarrays temporários de volta no array original
eu = 0 ;
j = 0 ;
k = eu ;
enquanto ( eu < n1 && j < n2 ) {
se ( eu [ eu ] <= R [ j ] ) {
arr [ k ] = eu [ eu ] ;
eu ++;
}
outro {
arr [ k ] = R [ j ] ;
j ++;
}
k ++;
}
// Copia os elementos restantes de L[]
enquanto ( eu < n1 ) {
arr [ k ] = eu [ eu ] ;
eu ++;
k ++;
}
// Copia os elementos restantes de R[]
enquanto ( j < n2 ) {
arr [ k ] = R [ j ] ;
j ++;
k ++;
}
}
vazio mergeSort ( int arr [ ] , int eu , int r )
{
se ( eu < r ) {
int m = eu + ( r - eu ) / 2 ;
// Classifica as metades esquerda e direita recursivamente
mergeSort ( arr , eu , m ) ;
mergeSort ( arr , m + 1 , r ) ;
// Mescla as duas metades classificadas
fundir ( arr , eu , m , r ) ;
}
}
int principal ( )
{
int arr [ ] = { 12 , onze , 13 , 5 , 6 , 7 } ;
int arr_size = tamanho de ( arr ) / tamanho de ( arr [ 0 ] ) ;
cout << 'O array dado é \n ' ;
para ( int eu = 0 ; eu < arr_size ; eu ++ )
cout << arr [ eu ] << ' ' ;
mergeSort ( arr , 0 , arr_size - 1 ) ;
cout << ' \n A matriz ordenada é \n ' ;
para ( int eu = 0 ; eu < arr_size ; eu ++ )
cout << arr [ eu ] << ' ' ;
retornar 0 ;
}
Este programa é como o anterior, mas em vez de usar dois subarrays temporários L e R, ele usa um único subarray temporário temp. A função de mesclagem funciona da mesma forma que antes, mas em vez de copiar os dados para L e R, ela os copia para temp. Em seguida, mescla os elementos da matriz temporária de volta ao arr que é a matriz original.
A função mergeSort é a mesma de antes, exceto que usa temp em vez de L e R para armazenar o subarray temporário.
Na função principal, definimos um array arr com 6 elementos e chamamos a função mergeSort para classificá-lo. A execução do código termina imprimindo o array ordenado na tela.
Conclusão
Merge sort é um algoritmo que classifica os elementos da matriz e usa a técnica de dividir e conquistar e faz comparações entre os elementos. A classificação por mesclagem em C++ tem uma complexidade de tempo de O(n log n) e é particularmente eficaz para classificar matrizes grandes. Embora exija memória adicional para armazenar os subarrays mesclados, sua estabilidade o torna uma escolha popular para classificação.