Algoritmo de ordenação estável que usa dividir para conquistar, dividindo o array ao meio e intercalando as metades ordenadas.
O Merge Sort divide o array ao meio repetidamente até ter subarrays de um elemento. Depois, intercala (merge) esses subarrays de volta, mantendo a ordem. O processo de intercalação compara os elementos dos dois subarrays ordenados e constrói o resultado elemento por elemento, sempre escolhendo o menor disponível. É um algoritmo estável (preserva a ordem relativa de elementos iguais) e tem complexidade garantida O(n log n), mas usa O(n) de espaço adicional.
“O Merge Sort garante O(n log n) em todos os casos porque sempre divide ao meio. A intercalação de dois arrays ordenados é O(n), e temos log n níveis de recursão.”
Sempre divide ao meio (log n níveis) e intercala n elementos em cada nível.
T(n) = 2T(n/2) + O(n). Pelo Teorema Mestre: O(n log n)
Precisa de arrays temporários para a intercalação.
Mesmo com array já ordenado, ainda divide e intercala.
Complexidade garantida, independente da entrada.
| Algoritmo | Tempo | Espaco | Estavel | Melhor Para |
|---|---|---|---|---|
| Merge Sort(atual) | O(n log n) | O(n) | Sim | Grandes datasets, estabilidade necessária |
| Quick Sort | O(n log n) | O(log n) | Nao | Uso geral, melhor performance média |
| Bubble Sort | O(n²) | O(1) | Sim | Fins didáticos |
| Selection Sort | O(n²) | O(1) | Nao | Quando trocas são caras |
Pratique respondendo a perguntas comuns de entrevistas tecnicas. Clique em uma pergunta para iniciar uma sessao de pratica com IA.
1def merge_sort(array):Definição2 if len(array) <= 1:Caso Base3 return array4 5 mid = len(array) // 2Divisão6 left = merge_sort(array[:mid])Chamadas Recursivas7 right = merge_sort(array[mid:])Chamadas Recursivas8 9 return merge(left, right)Intercalação10 11 12def merge(left, right):Intercalação13 result = []14 i = j = 015 16 while i < len(left) and j < len(right):17 if left[i] <= right[j]:Cópia da Esquerda18 result.append(left[i])19 i += 120 else:Cópia da Direita21 result.append(right[j])22 j += 123 24 result.extend(left[i:])Elementos Restantes25 result.extend(right[j:])Elementos Restantes26 27 return result28