]> Untitled Git - axy/ft/pushswap.git/commitdiff
added README.md
authorCorentin Lefrere <clefrere@k1r1p13.42mulhouse.fr>
Fri, 19 Dec 2025 12:20:44 +0000 (13:20 +0100)
committerCorentin Lefrere <clefrere@k1r1p13.42mulhouse.fr>
Fri, 19 Dec 2025 12:20:44 +0000 (13:20 +0100)
README.md [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
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