
def fusion(L1, L2):
    L3 = [None]*(len(L1)+len(L2)) # tableau de taille cumulée à celles de L1 et L2
    
    i = 0 # indice indiquant l'élément courant dans L1
    j = 0 # idem pour L2
    k = 0 # indice pour parcourir L3
    
    while i != len(L1) and j != len(L2) :
        if L1[i] <= L2[j]:
            L3[k] = L1[i]
            i = i + 1 # avance d'un élément dans L1
        else:
            L3[k] = L2[j]
            j = j + 1 # avance d'un élément dans L2

        k = k + 1 # élément à fusionner suivant dans L3
        
    if i == len(L1): # si on est arrivé à la fin de L1
        while j != len(L2):
            L3[k] = L2[j] # ajout des éléments restants de L2
            j = j + 1
    else:
         while i != len(L1): # sinon, ajout des éléments restants de L1
            L3[k] = L1[i]
            i = i + 1
    
    return L3

    
def tri_fusion(L):

    if len(L) <= 1 :
        return L

    mid = len(L)//2

    gauche = [L[i] for i in range(0,mid)]
    droite = [L[i] for i in range(mid, len(L))]
 

    gauche = tri_fusion(gauche)
    droite = tri_fusion(droite)
    
    return fusion(gauche, droite)


print(tri_fusion([2, 5, 7, 0, 1, 3, 8]))
