O que é Divide and Conquer e como o Merge Sort funciona?

O paradigma divide e conquista em ciência da computação é uma técnica para dividir recursivamente problemas em subproblemas menores. Um dos aspectos principais dessa técnica é a recursão, que acontece quando uma função chama a si mesma repetidamente até que um caso base seja alcançado. Nesta lição, vamos analisar o algoritmo merge sort para entender melhor como a técnica divide e conquista funciona. Vamos supor que temos esta lista de números:
42 37 53 17
O objetivo é ordenar essa lista do menor para o maior usando o algoritmo merge sort. O primeiro passo é dividir essa lista ao meio:
42 37 | 53 17
Então precisamos olhar para o lado esquerdo da lista:
42 37
Pegamos essa sublista e dividimos ao meio novamente até que cada sublista tenha apenas um item:
42 | 37
Uma lista com apenas um item é ordenada por padrão. Em seguida, precisamos mesclar cada uma dessas sublistas de um elemento em uma lista ordenada:
37 42
Então seguimos o mesmo processo para o lado direito da lista original:
# right side of original list
53 17

# divide the list in half
53 | 17

# merge the lists in sorted order
17 53
Agora que ambas as metades da lista original estão ordenadas, nós unimos essas duas metades e ordenamos os elementos:
17 37 42 53
Aqui está como o algoritmo se parece em código:
def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    mid = len(arr) // 2
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    sorted_list = []
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            sorted_list.append(left[i])
            i += 1
        else:
            sorted_list.append(right[j])
            j += 1

    sorted_list.extend(left[i:])
    sorted_list.extend(right[j:])

    return sorted_list
A complexidade de tempo para merge sort seria O(n log n) porque a lista é continuamente dividida ao meio (log n) e depois mesclada (O(n)). Ao contrário de outros algoritmos de ordenação como bubble sort, merge sort não é ordenado in place e tem uma complexidade de espaço de O(n).
Este módulo não possui perguntas. Marque como concluído.