Você está na página 1de 5

INTRODUÇÃO

Um algoritmo de ordenação é um conjunto de instruções que recebe um


array ou lista como entrada e organiza os itens em uma ordem específica,
normalmente alfabética ou numérica. Esses algoritmos são fundamentais na
computação por diminuir a complexidade de problemas, facilitando algoritmos
de busca, banco de dados, entre outros.

O seguinte trabalho abordará o funcionamento do algoritmo de


ordenação Merge Sort, contendo suas principais características, modo de
funcionamento, gráficos com seus tempos de execução e total de trocas em
diferentes situações, entre outras informações.
MERGE SORT
Existem diversos tipos de algoritmos de ordenação, possuindo os mais
diferentes métodos de funcionamento, no caso do Merge Sort ele utiliza a
lógica de divisão e conquista, sendo conhecido por ser estável e possuindo
uma complexidade de tempo de O (n log n), o que o torna eficiente em listas
grandes.
O seu funcionamento pode ser descrito em alguns passos:
 A primeira etapa na ordenação é dividir a lista em duas metades. Isso é
feito recursivamente até que cada segmento contenha apenas um
elemento.
 As metades divididas são então reunidas em ordem. Isto é feito
comparando os elementos das duas metades e colocando-os em ordem.
 A próxima etapa envolve comparar os elementos das metades reunidas
anteriormente e criar um segmento ordenado com base nessas
comparações. Para fazer isso, você precisa comparar o primeiro elemento
das duas metades, mover o elemento menor para o novo segmento
ordenado e, em seguida, avançar na metade de onde você obteve o
elemento. Este processo continua até que uma das metades esteja
completamente mesclada na lista ordenada. Quaisquer elementos
restantes na outra metade serão adicionados à lista ordenada porque já
estão em ordem.
 Essas etapas de ordenação devem ser repetidas, geralmente por
recursão, até que a lista seja classificada. À medida que os segmentos
são mesclados, a lista é colocada novamente na ordem correta.
A seguir uma imagem que ilustra o funcionamento descrito:
Com base em uma implementação do Merge Sort para Java foram
realizados alguns testes em diferentes situações, com elementos inseridos em
ordem, elementos inseridos em ordem inversa e elementos inseridos
aleatoriamente, assim, coletando o tempo médio de execução e o total de
trocas em diversos tamanhos de arrays. Seguem dois gráficos para
visualização dos resultados:

Gráfico de total de trocas.


Como o Merge Sort sempre vai dividir e mesclar o array o mesmo
número de vezes de acordo com o seu tamanho, a quantidade de
movimentações sempre será a mesma independente dos elementos
pertencentes a ele, portanto as três situações se sobrepõem no gráfico.
Gráfico do tempo de execução.
Se torna visível que o único caso que o tempo é maior é na situação de
elementos aleatórios, isso ocorre porque o algoritmo Merge Sort vai precisar
fazer mais comparações totais, mesmo que a quantidade de movimentação se
mantenha, porém, ainda assim os tempos de execução não se distanciam
muito, mantendo uma eficiência semelhante em qualquer caso.

Como visto anteriormente a complexidade do Merge Sort é O (n log n)


em qualquer situação, seja no melhor, médio ou pior caso, ele sempre vai
realizar a segmentação do array e posteriormente a sua mesclagem
independente da distribuição dos elementos do array previamente.
A origem da complexidade do Merge Sort se dá a partir da sua equação
de recorrência T(n) = 2T(n/2) + Θ(n), onde utilizando o segundo caso do
teorema mestre obtemos T(n) = Θ (n^ logba * logn) = Θ(nlogn), chegando
assim à T(n) = O(nlogn).

Um algoritmo é estável quando números com o


mesmo valor aparecem no array de saída na mesma
ordem em que aparecem no array de entrada. Esta
propriedade é importante quando os dados de satélite
que acompanham o objeto ordenado precisam ser
transmitidos com ele.
Dessa forma, o Merge Sort pode ser
considerado um algoritmo de ordenação estável, já
que corresponde corretamente a esta característica.
Concluindo, o Merge Sort é um algoritmo muito eficiente de ordenação,
sendo consistente na sua complexidade, O(nlogn), indiferentemente da
distribuição anterior dos dados. Ele se baseia em sucessivas partições e
junções para organizar os elementos do array, não sendo in-place, pois utiliza
array auxiliar (helper) na ordenação, e sendo um algoritmo estável.

Você também pode gostar