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
def fusion(tabpy-und1, tabpy-und2):bksl-nl ...bksl-nlbksl-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-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
:
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