4.ábra: Merge Sort (jóvoltából https://commons.wikimedia.org/wiki/File:Merge_sort_algorithm_diagram.svg) Merge Sort másrészt működik egy alapelv: ez rendkívül könnyű egyesíteni már rendezett tömbök. Tehát egy kezdő tömböt újra és újra kettéválaszt, amíg nem lesz más, mint egyetlen elem. Ezután lassan újjáépíti a fő tömb összevonásával ezeket az elemeket újra együtt rendezett sorrendben. Mivel az első méretű építőelemekből indultunk ki, nagyon könnyű volt kezdeti rendezett tömböket építeni. Ezután könnyű egyesíteni őket. Végül O (n log n) időt töltünk, és (fontos) ezt olyan módon tesszük, amely garantáltan stabil.
például megvalósítások lásd:
egyesítés Rendezés: https://www.geeksforgeeks.org/merge-sort/
Beszúrási Rendezés: https://www.geeksforgeeks.org/insertion-sort/
végrehajtása Tim Rendezés
a legfontosabb, hogy megértsük a Tim Sort végrehajtását megértése használata fut. A Tim Sort a természetben előforduló előre válogatott adatokat használja ki előnyére. Előre rendezve egyszerűen azt értjük, hogy a szekvenciális elemek mind növekednek vagy csökkennek (nem érdekel, melyik).
először állítsunk be egyminrun
méretet. Ez alatt azt értjük, hogy biztosítani akarjuk, hogy minden futásunk legalább egy bizonyos hosszúságú legyen. Felhívjuk figyelmét, hogy nem garantáljuk, hogy találunk ilyen méretű futásokat — később belemegyünk ebbe. Egyszerűen azt mondjuk, hogy a futásnak legalább egy bizonyos hosszúságúnak kell lennie.
amikor futással találkozunk, félretesszük. Amikor megtaláljuk a leghosszabb futást egy minrun
tartományon belül. Most már van egy ismerős adatstruktúránk: egy kicsi, rendezett tömb. Ha legalább minrun
hosszúságú, akkor hurrá! Tovább léphetünk. Ha nem, akkor beillesztjük a beillesztési Sort.
fentről emlékezhetsz arra, hogy a Beillesztés rendezése különösen hatékony kétféle tömbön: a kicsieken és a már rendezett tömbökön. Amit most készítettünk, az egy kicsi, rendezett tömb. Ha nem legalább minrun
hosszúságú, akkor előre nyúlunk, és megragadunk elég más elemet a Futtatás befejezéséhez, majd az Insertion Sort segítségével gyorsan és egyszerűen betoljuk őket a rendezett tömbünkbe. Nyilvánvaló, hogy ha egy futás találkozik a tömb végével, akkor hagyja, hogy egy kicsit rövid legyen.
miután létrehozta az összes fut (azaz rendezett subarrays), akkor használja a Merge Sort, hogy csatlakozzon hozzájuk. A legjobb esetben a teljes tömb már rendezve van, és Tim Sort elég okos ahhoz, hogy tudja, hogy nem kell mást tennie. Más idők, általában csak rendkívül hatékony. További előnyként mind a beszúrási rendezés, mind az Egyesítési Rendezés stabil, tehát a kapott tömb stabil.
azok számára, akik kedvelik a golyókat:
- hozzon létre egy
minrun
méret, amely 2 teljesítmény (általában 32, soha nem több, mint 64, vagy a beillesztési Rendezés elveszíti hatékonyságát)
- keressen egy futást az első
minrun
adatokban.
- Ha a Futtatás hossza nem éri el a
minrun
hosszúságot, akkor az Insertion Sort (Beszúrás Rendezés) használatával ragadja meg a következő vagy az előző elemeket, és illessze be őket a futásba, amíg a megfelelő minimális méret nem lesz.
- ismételje meg, amíg a teljes tömb rendezett alszakaszokra nem oszlik.
- használja az egyesítés Rendezés második felét a rendezett tömbök összekapcsolásához.
következtetés
Tim Sort erős. Gyors és stabil, de talán a legfontosabb, hogy kihasználja a valós mintákat, és felhasználja őket a végtermék elkészítéséhez. Ez minden helyzetben? Valószínűleg nem. Sok szerencsét programozása egy táblára egy interjú során, és ha csak szüksége van egy gyors egyszerű rendezési algoritmus egy csipetnyi akkor valószínűleg nem akar bajlódni végrehajtási valami ez a komplex. Azonban az adatok tudósok ropogó számok ez több mint érdemes egy pillantást.
a kíváncsi, akkor nézd meg a teljes Tim Sort kódot github.
köszönöm
Köszönöm mindenkinek az olvasóimnak. Nagyra értékelem az idejét, és őszintén remélem, hogy informatívnak találta a tartalmat. Ha bármilyen kérdése vagy válasza van, nyugodtan dobjon egyet alább.