Tri par tas
1 Tas
Il s'agit d'un arbre binaire qu'on représentera par un tableaut ; on fait les hypothèses suivantes :
- le noeud j a pour ls 2j + 1 et 2j+ 2 ; exceptionnellement un seul, 2j+ 1.
- la valeur d'un noeud est supérieure ou égale à celle de ses ls : t[j]≥t[2j+ 1], t[j]≥t[2j+ 2]
Questions
- Ecrire trois fonctions pere(j), lsG(j), lsD(j).
- Ecrire une fonction est_un_tas (t) qui vérie sit est un tas.
- Ecrire une fonction cree_un_tas(taille, entier_max) qui construit un tas aléatoire.
2 Insertion dans un tas
Soitt un tas ; on souhaite ajouter un élémentx.
Si on exécute seulement t.append(x),t peut ne plus être un tas.
Question
Ecrire une fonction insere_dans_tas(t,x) qui ajoute x au tas t et qui restaure la structure de tas en faisant remonterxvers la racine.
3 Suppression
On souhaite extraire l'élément qui est à la racine de l'arbre ; pour cela, on le remplace par le dernier élément du tableau :
t[0] =t[n−1]
Ensuite, pour restaurer la structure de tas, on fait descendre cet élément dans l'arbre en le remplaçant, si nécessaire, par le maximum de ses deux ls, qui à son tour est remplacé...
Questions
- Ecrire une fonction plus_grand_ls(t,j) qui renvoie2j+ 1, ou2j+ 2, ou−1dans le cas où j est une feuille.
- Ecrire une fonction extrait_racine(t) qui extrait la racine de l'arbre et restaure la structure de tas.
4 Tri par tas
Pour trier une listeL:
- on crée un tas en insérant successivement les éléments deL. - on les extrait un à un.
On obtient ainsi un tri de complexitén.lnndans le pire des cas ; ce qui est aussi le cas du tri... ?
Questions
- Ecrire une fonction tri_par_tas(L) qui utilise ce qui précède.
- Comment faire pour obtenir un 'tri en place', c'est à dire sans utilisation de listes auxiliaires ?