mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 10:50:36 +00:00
92 lines
2.0 KiB
Python
92 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Mon Feb 10 09:15:57 2025
|
|
|
|
@author: elouan.fare
|
|
"""
|
|
|
|
|
|
import liste as fifo
|
|
|
|
|
|
def taille(liste):
|
|
a = 0
|
|
while not (fifo.est_vide(liste)):
|
|
liste = fifo.queue(liste)
|
|
a += 1
|
|
return a
|
|
|
|
|
|
def divise2(liste):
|
|
n = taille(liste)
|
|
droite, gauche = partition(liste, 0, n // 2)
|
|
return droite, gauche
|
|
|
|
|
|
def renverser(liste):
|
|
result = fifo.creer_liste()
|
|
while not fifo.est_vide(liste):
|
|
result = fifo.ajouter(result, fifo.tete(liste))
|
|
liste = fifo.queue(liste)
|
|
return result
|
|
|
|
|
|
def partition(liste, debut, fin):
|
|
if fifo.est_vide(liste):
|
|
return fifo.creer_liste(), fifo.creer_liste()
|
|
|
|
current = liste
|
|
for _ in range(debut):
|
|
if fifo.est_vide(current):
|
|
break
|
|
current = fifo.queue(current)
|
|
|
|
segment_inversé = fifo.creer_liste()
|
|
for _ in range(fin - debut):
|
|
if fifo.est_vide(current):
|
|
break
|
|
segment_inversé = fifo.ajouter(segment_inversé, fifo.tete(current))
|
|
current = fifo.queue(current)
|
|
|
|
segment = renverser(segment_inversé)
|
|
|
|
return current, segment
|
|
|
|
|
|
def fusion(gauche, droite):
|
|
if fifo.est_vide(gauche):
|
|
return droite
|
|
if fifo.est_vide(droite):
|
|
return gauche
|
|
|
|
if fifo.tete(gauche) <= fifo.tete(droite):
|
|
return fifo.ajouter(fusion(fifo.queue(gauche), droite), fifo.tete(gauche))
|
|
else:
|
|
return fifo.ajouter(fusion(gauche, fifo.queue(droite)), fifo.tete(droite))
|
|
|
|
|
|
def merge_sort(liste):
|
|
|
|
if fifo.est_vide(liste):
|
|
return liste
|
|
elif fifo.est_vide(fifo.queue(liste)):
|
|
return liste # si elle ne contient que un elt
|
|
gauche, droite = divise2(liste)
|
|
|
|
tri1 = merge_sort(gauche) # recursif
|
|
tri2 = merge_sort(droite) # recursif
|
|
|
|
return fusion(tri1, tri2)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
liste = fifo.creer_liste()
|
|
for i in reversed(range(100)):
|
|
liste = fifo.ajouter(liste, i)
|
|
print(liste)
|
|
|
|
print("Après avoir trié la liste:")
|
|
|
|
print(merge_sort(liste))
|