Az Egyesítés rendezéséhez hasonlóan a QuickSort is Divide and Conquer algoritmus. Kiválaszt egy elemet pivotként, és particionálja az adott tömböt a kiválasztott pivot köré. A quickSort számos különböző verziója létezik, amelyek különböző módon választják meg a forgatást.
- Az első elemet mindig válassza ki pivotként.
- Az utolsó elemet mindig válassza ki pivotként (az alábbiakban implementálva)
- Válasszon egy véletlenszerű elemet pivotként.
- Válasszon mediánt pivotként.
A quickSort kulcsfontosságú folyamata a partíció (). A partíciók célpontja, ha egy tömböt és egy tömb x elemet ad el forgatásként, az x-et a megfelelő helyzetbe helyezi a rendezett tömbben, és az összes kisebb elemet (x-nél kisebb) x elé helyezi, az összes nagyobb elemet (x-nél nagyobb) pedig az x. Mindezt lineáris időben kell megtenni.
Pszeudokód a rekurzív QuickSort funkcióhoz:
Partíció algoritmus
A partíció sokféleképpen hajtható végre, az álkód követi a CLRS könyvben megadott módszert. A logika egyszerű, a bal szélső elemből indulunk ki, és nyomon követjük a kisebb (vagy azzal egyenlő) elemek indexét, mint i. Mozgás közben, ha találunk egy kisebb elemet, akkor az aktuális elemet felcseréljük arr-el. Ellenkező esetben figyelmen kívül hagyjuk az aktuális elemet.
Álkód a partícióhoz ()
A partíció () illusztrációja:
Megvalósítás:
A QuickSort megvalósításai:
Kimenet:
Sorted array:1 5 7 8 9 10
A QuickSort elemzése
A QuickSort által elvárt idő általában a következőképpen írható.
T(n) = T(k) + T(n-k-1) + (n)
Az első két kifejezés két rekurzív hívásra vonatkozik, az utolsó kifejezés a partíció folyamatára vonatkozik. k a pivotnál kisebb elemek száma.
A QuickSort által igénybe vett idő függ a bemeneti tömbtől és a partíciós stratégiától. Az alábbiakban három eset látható.
Legrosszabb eset: A legrosszabb eset akkor következik be, amikor a partíciós folyamat mindig a legnagyobb vagy a legkisebb elemet választja el pivotként. Ha a fenti partíciós stratégiát vesszük figyelembe, ahol az utolsó elem mindig pivotként van kiválasztva, akkor a legrosszabb eset akkor következne be, ha a tömb már növekvő vagy csökkenő sorrendbe van rendezve. A következő a legrosszabb esetben is megismétlődik.
T(n) = T(0) + T(n-1) + (n)which is equivalent to T(n) = T(n-1) + (n)
A fenti megismétlődés megoldása (n2).
Legjobb eset: a legjobb eset akkor következik be, amikor a partíció folyamata mindig kiválasztja a középső elem pivotként. A legjobb esetben az ismétlődés következik.
T(n) = 2T(n/2) + (n)
A fenti megismétlődés megoldása (nLogn). Megoldható a főtétel 2. esetével.
Átlagos eset:
Az átlagos esetelemzés elvégzéséhez meg kell vizsgálnunk a tömb összes lehetséges permutációját, és ki kell számolnunk minden olyan permutáció idejét, amely nem könnyen néz ki.
Átlagot kaphatunk az átlagos esetről, ha figyelembe vesszük azt az esetet, amikor a partíció O (n / 9) elemeket egy halmazba, O (9n / 10) elemeket pedig egy másik halmazba helyez. Az alábbiakban megismétlődik ez az eset.
T(n) = T(n/9) + T(9n/10) + (n)
A fenti megismétlődés megoldása szintén O (nLogn)
Bár a QuickSort időbeli bonyolultsága a legrosszabb esetben O (n2), több, mint sok más rendezési algoritmus, mint a Merge Sort és a Heap Sort, a QuickSort gyorsabb a gyakorlatban, mert belső hurka hatékonyan megvalósítható a legtöbb architektúrán és a legtöbb valós adatban. A QuickSort különféle módon valósítható meg az elfordulás választásának megváltoztatásával, így a legrosszabb eset ritkán fordul elő egy adott típusú adathoz. Az egyesítés rendezése azonban általában jobbnak tekinthető, ha az adatok hatalmasak és külső tárhelyen vannak tárolva.
A QuickSort stabil?
Az alapértelmezett megvalósítás nem stabil. Bármely rendezési algoritmust stabilá lehet tenni, ha az indexeket összehasonlítási paraméternek tekintjük.
A QuickSort helyben van?
A helyben alkalmazott algoritmus tág definíciója szerint helyben történő rendezési algoritmusnak minősül, mivel extra hely csak rekurzív függvényhívások tárolására, de nem a bemenet manipulálására.
Hogyan lehet megvalósítani a QuickSort összekapcsolt listákhoz?
QuickSort az egyedül összekapcsolt listán
QuickSort a kétszeresen összekapcsolt listán
Meg tudjuk-e valósítani a QuickSort-ot?
Igen, kérjük, olvassa el az Iterative Quick Sort alkalmazást.
Miért előnyösebb a Gyors rendezés a MergeSort helyett a tömbök rendezéséhez br> A Gyors rendezés általános formájában helyben rendezett (azaz nem igényel külön tárhelyet), míg az egyesítés rendezéséhez O (N) extra tárhelyre van szükség, N pedig a tömb méretét jelöli, ami meglehetősen drága lehet. Az összevonási rendezéshez használt extra hely felosztása és elosztása növeli az algoritmus futási idejét. Összehasonlítva az átlagos komplexitást, azt találjuk, hogy mindkét típusú fajta O (NlogN) átlagos komplexitással rendelkezik, de az állandók különböznek. A tömbök esetében az egyesítés rendezése elveszíti az extra O (N) tárterület használata miatt.
A Quick Sort legtöbb gyakorlati megvalósítása véletlenszerű verziót használ. A randomizált verzió az O (nLogn) várható időbeli összetettségét várja.A legrosszabb eset véletlenszerű változatban is lehetséges, de a legrosszabb eset nem egy adott minta (például rendezett tömb) esetében fordul elő, és a randomizált Gyors rendezés a gyakorlatban is jól működik.
A Gyors rendezés gyorsítótár-barát rendezés is algoritmus, mivel tömbökhöz jó referencia-lokalitással rendelkezik.
A gyors rendezés szintén farok rekurzív, ezért a farok hívás optimalizálása megtörtént. ?
Összekapcsolt listák esetében az eset főleg a tömbök és a kapcsolt listák memória-allokációjának különbsége miatt van. A tömböktől eltérően a csatolt lista csomópontok nem lehetnek szomszédosak a memóriában. A tömbtől eltérően a linkelt listában az elemeket középen beilleszthetjük O (1) extra szóközbe és O (1) időbe. Ezért az összevonási rendezés egyesítési művelete külön hely nélkül valósítható meg a kapcsolt listák számára.
A tömbökben véletlenszerű hozzáférést tehetünk, mivel az elemek folyamatosak a memóriában. Tegyük fel, hogy van egy egész számú (4 bájtos) A tömbünk, és hagyjuk, hogy A címe x legyen, majd az A eléréséhez közvetlenül hozzáférhetünk az (x + i * 4) memóriához. A tömbökkel ellentétben a linkelt listában nem végezhetünk véletlenszerű hozzáférést. A Gyors rendezés sok ilyen hozzáférést igényel. Az összekapcsolt listában az i. index eléréséhez minden egyes csomópontot el kell utaznunk a fejétől az i. csomópontig, mivel nincs folyamatos memóriablokkunk. Ezért növekszik a rezsi a gyors rendezés érdekében. A rendezés egyesíti az adatokat egymás után, és a véletlenszerű hozzáférés igénye alacsony.
Hogyan optimalizálható a QuickSort úgy, hogy a legrosszabb esetben O (Log n) extra helyet foglaljon el?
Kérjük, olvassa el a QuickSort hátsó hívásoptimalizálás című részt (A legrosszabb eset csökkentése Log n-re)
Pillanatképek:
- Kvíz a QuickSortról
- Legutóbbi cikkek a QuickSortról
- Kódolási gyakorlat rendezés.
Egyéb rendezési algoritmusok a GeeksforGeeks / GeeksQuiz webhelyen:
Kiválasztás rendezése, Bubble Sort, Beszúrás rendezése, Egyesítés rendezése, Halom rendezése, QuickSort , Radix rendezés, számlálás rendezése, vödör rendezés, ShellSort, fésűs rendezés, galamblyuk rendezés