From 08ce2eae5946b30e8cee65981b8a4988fd4d88f6 Mon Sep 17 00:00:00 2001 From: Corentin Lefrere Date: Fri, 19 Dec 2025 13:20:44 +0100 Subject: [PATCH] added README.md --- README.md | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5e06eb --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +*This project has been created as part of the 42 curriculum by agilliar, clefrere.* + +# PUSH_SWAP (FR) + +## Description : + +L'objectif de push_swap est de trier une liste d'int. + +Pour cela, nous avons deux stacks (a et b), une liste de valeurs et des opérations permettant de manipuler les stacks. + +**Pour faire le tri de ces éléments, il est nécessaire d'utiliser 4 algorithmes distinct, qui pourront être choisi lors de l'exécution du programme grâce au flag correspondant : --simple / --medium / --complex / --adaptive. Plus la complexité de l'algorithme est élevée, plus la liste va se trier rapidement.** + +Certains algorithmes utilisent un split sort (par agilliar), tri récursif similaire a quick sort, partitionnant en n chunks, en extrayant deux chunks par passages sur la liste. + +Les tris des petites tailles du split sort sont effectuées via une table pré calculée d'instructions optimal. + +Un optimiser a été ajouté pour simplifier certaines combinaisons d'opérations triviales. + + + +### Algorithme simple (O(n^2)): + +Nous avons choisi d'utiliser le **selction sort**. + +Nous faisons une rotation du stack `a` jusqu'à trouver le plus petit élément, qui sera push sur `b`. + +Une fois `a` vide, l'ensemble de `b` sera push sur `a` pour remettre l'ensemble des éléments dans le bon ordre. + +Cet algorithme a été choisi car celui-ci est facile à mettre en place et à comprendre. + + + +### Algorithme intermédiaire (O(n^1.5)) + +L'algorithme intermédiaire est un **splitsort** avec le nombre de chunks proportionnel a la racine de la taille de la liste, ce qui permet d'avoir la complexité voulue. + +Cet algorithme a été choisi car il permet d'avoir l'excellente performance de splitsort tout en restant O(n^1.5). + + + +### Algorithme Complexe (O(n log n)) + +Pour l'algorithme complexe, nous avons choisi d'utiliser le **split sort** avec un nombre de chunks constant (5). + +Il se rapproche donc d'un quicksort tout en étant plus performant, et atteint la complexité demandée. + + +### Algorithme adaptatif + +Nous partons du principe que le "low disorder" est une erreur et que la complexité attendue est de n^2, car le problème est impossible sinon (voir avec agilliar pour le détail). + +Pour notre implémentation, nous choisissons simplement l'un des algorithmes précédents. + +### Le bench + +Le bench est un flag supplémentaire (`--bench`) qui va permettre d'afficher des informations supplémentaires lors de l'exécution du programme : + +**Le desorde** + +**La strategie (algorithme utilise)** + +**Le nombre total d'opérations avant et après optimiser** + +**Le nombre de fois que chaque opération a été utilisé** + + + +## Instructions + +1) Programme + +a) Faire `make` + +b) Sans flag : `./push_swap 2 1 3 6 5 8` + +c) Avec un flag d'algorithme : `./push_swap --simple 2 1 3 6 5 8` + +d) Avec le flag bench : `./push_swap --bench 2 1 3 6 5 8` + +e) Avec bench + algorithme : `./push_swap 2 1 3 6 5 8 --bench --simple` + +3) Bonus : + +a) Faire `make bonus` + +b) `INPUT=$(shuf -i 1-100)` + +c) `./push_swap $(echo $INPUT) | ./checker $(echo $INPUT)` + +4) Utiliser le testeur : + +a) Télécharger le checker + +b) `INPUT=$(shuf -i 1-100)` + +c) `./push_swap $(echo $INPUT) | ./checker_linux $(echo $INPUT)` + + + +## Ressources + +Pour la compréhension de sélection sort : + +**Wikipedia** + +**GeeksforGeeks** + +L'IA n'a pas été utilisée pour ce projet. + +# PUSH_SWAP (ENG) \ No newline at end of file -- 2.51.0