diff --git a/timsort.md b/timsort.md new file mode 100644 index 0000000..48f1a68 --- /dev/null +++ b/timsort.md @@ -0,0 +1,45 @@ +# Timsort + +- Hybrid aus Insertion und Mergesort +- weniger als 64 Elemente: Insertionsort + +## Insertionsort + +- erste Element des unsortierten Arrays in das sortierte Array kopiert +- Danach wird geschaut, ob das zweite Element größer als das letzte Element im sortierten Array ist. Dann wird es rechts davon einsortiert +- Ansonsten wird der Index vom zu überprüfenden Element halbiert und von vorne begonnen +- In der Mitte des eingegrenzten Bereiches wird überprüft, ob das Element größer oder kleiner ist, so wird der mögliche Bereich mit jedem Mal halbiert +- Nachdem die richtige Stelle gefunden wurde, wird die Zahl dort eingeschoben + +## Runs + +- Das unsortierte Array wird in Runs aufgeteilt +- jeder Runs hat eine Mindestgröße, den minrun, normlerweise zwischen 32 und 64 +- viele Daten enthalten bereits sortierte Teile +- Aufsteigende und aufsteigende Reihe werden erkannt +- absteigende Reihen werden umgekehrt + +## Merge + +- jeweiles zwei Arrays werden gemerged +- Überprüfung am Anfang welches Arrays die Zahl kleiner ist +- kopieren der Zahl in das sortierte Array und lösche der Zahl im Ursprungsarray +- nach einem Durchgang nur noch die Hälfte der Arrays +- wiederholen bis alle Zahlen im einen Array sind + +### Galloping + +- wenn 7 mal in Folge die kleinere Zahl im selben Array ist +- wird nach der Zahl des anderen Arrays, welche als nächstes einsortiert wird, im ersten Array gesucht +- alles von der aktuellen Position bis zur gefundenen Position des ersten Arrays wird in das sortierte Array kopiert + +## Quellen + +https://www.youtube.com/watch?v=_dlzWEJoU7I +https://en.wikipedia.org/wiki/Timsort +https://en.wikipedia.org/wiki/Exponential_search +https://www.geeksforgeeks.org/timsort/ + +## Code + +https://git.redstoneunion.de/MrGeorgen/timsort