Comme vous l'avez remarqué, nous allons implémenter cet algorithme de façon récursive.
Il existe également une version itérative qui se construit de façon plus ou moins semblable.
L'implémentation de cet algorithme repose essentiellement en 3 fonctions :
dont les rôles et les implémentations sont détaillés ci-dessous.
Insert
La première fonction insère un élément quelconque dans une liste triée par ordre croissant.
Si la séquence dans laquelle on doit insérer l'élément est vide, on se contente de l'ajouter à la séquence et on la retourne.
Dans le cas contraire, on va comparer l'élément à insérer avec le tout premier élément de la séquence.
Si l'élément à insérer est plus petit (l'ordre croissant est alors respecté) on l'insère en première position et on retourne la nouvelle séquence. Si ce n'est pas le cas, on appelle récursivement la fonction insert en lui passant comme argument l'élément à insérer et la séquence, en ayant pris soin de ne pas considérer le premier élément.
La terminaison de la récursion est garantie, puisqu'à chaque instance, la taille de la séquence décroît d'une unité.
Ces considérations mènent à la fonction suivante :
Code : Python | # La fonction insert prend l'élément à insérer et une séquence triée en tant qu'arguments.
# Elle insère l'élement à la place correcte dans la séquence et retourne cette-dernière.
def insert(element, sequence):
if sequence==[]:
return [element]
elif element<=sequence[0]:
return [element] + sequence
else:
return [sequence[0]] + insert(element, sequence[1:len(sequence)])
|
C'est tout en ce qui concerne cette fonction.
Merge
Comment implémenter la fonction de fusion, clé de voûte de notre algorithme ?
On va d'abord vérifier qu'aucune des sous-séquences n'est vide; si c'est le cas, on retournera l'autre sous-séquence : il n'y a alors rien à fusionner (cas trivial).
On va ensuite fusionner les 2 sous-séquences. Le principe sera d'extraire le premier élément de la première sous-séquence et de l'insérer dans la seconde, au moyen de la fonction insert.
Concrètement, on appellera récursivement la fonction merge en donnant comme argument la première sous-séquence, sans considérer son premier élément, et la séquence résultante de l'insertion du premier élément de la première sous-séquence dans la seconde, en tant que second argument.
Cela nous mène à la fonction suivante
Code : Python | # La fonction merge prend 2 séquences triées comme arguments.
# Elle retourne une fusion des 2 séquences telles que la séquence résultante est triée.
def merge(subSequence1,subSequence2):
if subSequence1==[]:
return subSequence2
elif subSequence2==[]:
return subSequence1
else:
return merge(subSequence1[1:len(subSequence1)],insert(subSequence1[0], subSequence2))
|
La terminaison de la récursion est également garantie, puisque à chaque instance de récursion, la taille d'une des deux sous-séquences décroît d'une unité. On finira irrémédiablement par se retrouver dans un des ces 2 cas triviaux, à savoir, une séquence vide.
C'est tout en ce qui concerne cette fonction, passons à la dernière des 3 !
MergeSort
Celle-ci est probablement la plus simple des 3, pour peu que vous ayez compris les 2 autres.
On vérifier si la séquence fournie en entrée n'est pas vide ou ne se résume pas un seul élément, auquel cas, il n'y a rien à faire !
Si les tests sont concluants, on lancera la fonction de fusion sur 2 sous séquences récursives du tableau.
On a enfin la fonction suivante
Code : Python | # La fonction mergeSort prend la séquence à trier comme argument. La séquence d'entrée est supposée être une liste.
# Cette fonction retourne une permutation de la séquence d'entrée, triée par ordre croissant.
def mergeSort(sequence):
if len(sequence)==0 or len(sequence)==1:
return sequence
else:
return merge(mergeSort(sequence[0:n/2]),mergeSort(sequence[n/2+1:n]))
|
La terminaison de la récursion est encore une fois garantie, puisque la taille des deux sous-séquences décroît à chaque instance de récursion. On finira par aboutir au cas trivial, marquant la fin de la récursion.
Il suffit de combiner ces 3 fonctions pour avoir notre algorithme au complet, algorithme que voici
Secret (cliquez pour afficher)Code : Python 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | # La fonction insert prend l'élément à insérer et une séquence triée en tant qu'arguments.
# Elle insère l'élement à la place correcte dans la séquence et retourne cette-dernière.
def insert(element, sequence):
if sequence==[]:
return [element]
elif element<=sequence[0]:
return [element] + sequence
else:
return [sequence[0]] + insert(element, sequence[1:len(sequence)])
# La fonction merge prend 2 séquences triées comme arguments.
# Elle retourne une fusion des 2 séquences telles que la séquence résultante est triée.
def merge(subSequence1,subSequence2):
if subSequence1==[]:
return subSequence2
elif subSequence2==[]:
return subSequence1
else:
return merge(subSequence1[1:len(subSequence1)],insert(subSequence1[0], subSequence2))
# La fonction mergeSort prend la séquence à trier comme argument. La séquence d'entrée est supposée être une liste.
# Cette fonction retourne une permutation de la séquence d'entrée, triée par ordre croissant.
def mergeSort(sequence):
if len(sequence)==0 or len(sequence)==1:
return sequence
else:
return merge(mergeSort(sequence[0:n/2]),mergeSort(sequence[n/2+1:n]))
|
Les fonctions ont été implémentées en Python. Le choix de Python est dicté car ce langage permet une implémentation courte et compréhensible du code. À vous de l'adapter dans le langage que vous préférez.