Menu
Coddy logo textTech

Merge Sort

Última atualização

Merge sort é um algoritmo de dividir para conquistar. Ele divide recursivamente o array ao meio até que cada pedaço tenha um único elemento (que está trivialmente ordenado), e então intercala os pedaços de volta em ordem. O passo de intercalação percorre dois subarrays ordenados com dois ponteiros, sempre copiando o menor elemento da frente. Pressione reproduzir acima para ver o array ser reconstruído fusão a fusão.

Como sempre divide ao meio, o merge sort executa em tempo O(n log n) em todos os casos - seu pior caso é tão bom quanto o melhor. O custo é O(n) de espaço adicional para o buffer temporário de intercalação.

Complexidade de tempo e espaço

CasoComplexidadeNotas
Melhor casoO(n log n)Sempre divide a entrada ao meio
Caso médioO(n log n)Ordem aleatória
Pior casoO(n log n)Garantido - não há entradas ruins
EspaçoO(n)Buffer temporário para a intercalação
EstávelSimEmpates resolvidos pela esquerda durante a intercalação

Passo a passo

PassoO que acontece
1Se o intervalo tem 0 ou 1 elementos, já está ordenado.
2Divide o intervalo em duas metades.
3Ordena recursivamente a metade esquerda com merge sort.
4Ordena recursivamente a metade direita com merge sort.
5Intercala as duas metades ordenadas com dois ponteiros.

Exemplo resolvido

Ordenando [5, 2, 4, 1]:

PassadaArrayAção
Dividir[5, 2] | [4, 1]Divide o array em duas metades
Dividir[5] [2] | [4] [1]Divide de novo até que cada pedaço seja um único elemento
Intercalar[2, 5] | [1, 4]Intercala [5],[2] em [2, 5] e [4],[1] em [1, 4]
Intercalar[1, 2, 4, 5]Intercala [2, 5] e [1, 4]: escolhe 1, depois 2, depois 4, depois 5
Pronto[1, 2, 4, 5]O array está totalmente ordenado

Quando usar o merge sort

Use quandoEvite quando
Você precisa de um pior caso garantido de O(n log n)A memória é limitada e O(n) de espaço extra é inaceitável
A estabilidade importa (chaves iguais mantêm sua ordem)Você ordena arrays pequenos onde o insertion sort é mais rápido
Você ordena uma lista encadeadaA ordenação in-place é um requisito rígido
Os dados são grandes demais para a RAM (ordenação externa)A localidade de cache domina e as passadas in-place do quicksort vencem

Código de Merge Sort

Uma implementação limpa e executável de Merge Sort em Python, JavaScript, Java, C++, C. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Merge Sort em Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Execute este código no Playground de Python

Perguntas frequentes sobre Merge Sort

Qual é a complexidade de tempo do merge sort?
Merge sort é O(n log n) no melhor, no médio e no pior caso, porque sempre divide o array ao meio. Ele usa O(n) de espaço adicional para o buffer de intercalação.
O merge sort é estável?
Sim, quando o passo de intercalação resolve os empates pegando primeiro da metade esquerda. Isso mantém os elementos iguais em sua ordem relativa original, por isso o merge sort é uma escolha comum para ordenação estável.
Por que usar merge sort em vez de quicksort?
Merge sort garante O(n log n) mesmo em entradas adversas e é estável, enquanto o quicksort pode degradar para O(n²). Merge sort também é preferido para listas encadeadas e ordenação externa. A desvantagem é sua memória adicional de O(n).
Qual é a diferença entre merge sort e quicksort?
Ambos são ordenações de dividir para conquistar, mas o quicksort particiona em torno de um pivô e ordena in-place com O(log n) de espaço de pilha, enquanto o merge sort divide cegamente ao meio e intercala usando um buffer de O(n). Quicksort costuma ser mais rápido na prática por causa da localidade de cache, mas o merge sort tem um pior caso garantido de O(n log n) e é estável.
Quando devo usar merge sort na prática?
Recorra ao merge sort quando precisar de uma ordenação estável com limite garantido de O(n log n), ao ordenar listas encadeadas (onde não precisa de acesso aleatório), ou ao fazer ordenação externa de dados grandes demais para caber na memória. Evite-o quando a memória é escassa, pois ele precisa de O(n) de espaço adicional.
O merge sort ordena in-place?
Não. O merge sort padrão aloca um buffer temporário de O(n) para intercalar as duas metades, então não é in-place. Existem variantes de intercalação in-place, mas são complexas e ou mais lentas ou perdem a estabilidade, então a versão baseada em buffer é a escolha comum.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR