Fusion

Programmer la fonction fusion prenant en paramètres deux tableaux tab_1 et tab_2 (type list) d'entiers, chacun trié dans l’ordre croissant, et renvoyant un tableau trié dans l’ordre croissant et contenant l’ensemble des valeurs de tab_1 et tab_2.

Compléter le code fourni dans l'IDE et le tester :

Contrainte

Il est interdit dans cet exercice d'utiliser sort ou sorted

###
# Testsbksl-nlassert fusion([3, 5], [2, 5]) == [2, 3, 5, 5]bksl-nlassert fusion([-2, 4], [-3, 5, 10]) == [-3, -2, 4, 5, 10]bksl-nlassert fusion([4], [2, 6]) == [2, 4, 6]bksl-nlbksl-nl# Autres testsbksl-nlbksl-nlassert fusion([10, 10], [1, 1, 1, 1]) == [1, 1, 1, 1, 10, 10]bksl-nlassert fusion([1, 2, 3, 6, 7, 8], [4, 5, 11, 11]) == [1, 2, 3, 4, 5, 6, 7, 8, 11, 11]bksl-nlassert fusion([1, 2, 3, 6, 7, 8], [10, 11, 15, 15, 20]) == [bksl-nl 1,bksl-nl 2,bksl-nl 3,bksl-nl 6,bksl-nl 7,bksl-nl 8,bksl-nl 10,bksl-nl 11,bksl-nl 15,bksl-nl 15,bksl-nl 20,bksl-nl]bksl-nlassert fusion([1, 3, 5, 7], [2, 4, 6, 8]) == [1, 2, 3, 4, 5, 6, 7, 8]bksl-nlassert fusion([5, 6, 15, 16, 25, 26], [1, 2, 10, 11, 20, 21]) == [bksl-nl 1,bksl-nl 2,bksl-nl 5,bksl-nl 6,bksl-nl 10,bksl-nl 11,bksl-nl 15,bksl-nl 16,bksl-nl 20,bksl-nl 21,bksl-nl 25,bksl-nl 26,bksl-nl]bksl-nlbksl-nlimport randombksl-nlbksl-nlexemplepy-unda = sorted(random.sample(range(10py-strpy-str9), 100))bksl-nlexemplepy-undb = sorted(random.sample(range(10py-strpy-str9), 100))bksl-nlattendu = exemplepy-unda + exemplepy-undbbksl-nlattendu.sort()bksl-nlresultat = fusion(exemplepy-unda[:], exemplepy-undb[:])bksl-nlfor a, b in zip(resultat, attendu):bksl-nl assert a == b, "Erreur dans la fusion de grandes listes"bksl-nlbksl-nlresultat = fusion(exemplepy-unda, [])bksl-nlfor a, b in zip(resultat, exemplepy-unda):bksl-nl assert a == b, "Erreur dans la fusion quand la seconde est vide"bksl-nlbksl-nlresultat = fusion([], exemplepy-undb)bksl-nlfor a, b in zip(resultat, exemplepy-undb):bksl-nl assert a == b, "Erreur dans la fusion quand la première est vide"bksl-nlbksl-nl 5/5

def fusion(tabpy-und1, tabpy-und2):bksl-nl ...bksl-nlbksl-nlbksl-nl# Testsbksl-nlassert fusion([3, 5], [2, 5]) == [2, 3, 5, 5]bksl-nlassert fusion([-2, 4], [-3, 5, 10]) == [-3, -2, 4, 5, 10]bksl-nlassert fusion([4], [2, 6]) == [2, 4, 6]bksl-nlassert fusion([1, 6, 10], []) == [1, 6, 10]bksl-nlbksl-nldef fusion(tabpy-und1, tabpy-und2):bksl-nl tabpy-undfusion = []bksl-nl ipy-und1 = 0bksl-nl ipy-und2 = 0bksl-nl while ipy-und1 < len(tabpy-und1) and ipy-und2 < len(tabpy-und2):bksl-nl if tabpy-und1[ipy-und1] < tabpy-und2[ipy-und2]:bksl-nl tabpy-undfusion.append(tabpy-und1[ipy-und1])bksl-nl ipy-und1 += 1bksl-nl else:bksl-nl tabpy-undfusion.append(tabpy-und2[ipy-und2])bksl-nl ipy-und2 += 1bksl-nlbksl-nl while ipy-und2 < len(tabpy-und2):bksl-nl # Cas où il reste des éléments dans tabpy-und2bksl-nl tabpy-undfusion.append(tabpy-und2[ipy-und2])bksl-nl ipy-und2 += 1bksl-nlbksl-nl while ipy-und1 < len(tabpy-und1):bksl-nl # Cas où il reste des éléments dans tabpy-und1bksl-nl tabpy-undfusion.append(tabpy-und1[ipy-und1])bksl-nl ipy-und1 += 1bksl-nlbksl-nl return tabpy-undfusionbksl-nlbksl-nl

A

👉 Dans la solution proposée, on sort de la boucle :
while i_1 < len(tab_1) and i_2 < len(tab_2):
lorsque i_1 > len(tab_1) ou i_2 < len(tab_2)

Il y a donc au plus une des deux boucles while suivantes qui sera exécutée.

👉 Autre solution possible avec une seule boucle for:

🐍 Script Python
def fusion(tab_1, tab_2):
    n_1, n_2 = len(tab_1), len(tab_2)
    i_1, i_2 = 0, 0
    tab = []
    for i in range(n_1 + n_2):
        if i_1 < n_1 and (i_2 >= n_2 or tab_1[i_1] <= tab_2[i_2]):
            tab.append(tab_1[i_1])
            i_1 += 1
        else:
            tab.append(tab_2[i_2])
            i_2 += 1
    return tab

Z