introsort
Főnév
introsort (tsz. introsorts)
- (informatika) Az Introsort (teljes nevén Introspective Sort) egy hibrid rendezési algoritmus, amely három jól ismert módszert ötvöz:
- Quicksort – gyors átlagos esetű teljesítmény,
- Heapsort – garantált időbonyolultság a legrosszabb esetben is,
- Insertion sort – gyors kis méretű adathalmazok esetén.
A neve arra utal, hogy introspektív, vagyis figyeli saját viselkedését, és ha a Quicksort túl sok rekurzív lépést tenne (jelezve a legrosszabb esetet), akkor átnyergel Heapsort-ra.
⚙️ Miért jó az Introsort?
- Gyors mint a Quicksort a legtöbb gyakorlati esetben,
- Biztonságos mint a Heapsort: elkerüli a legrosszabb esetet,
- Hatékony kis tömbökön, ahol Insertion sort váltja ki a Quicksort-ot.
Ez az algoritmus a C++ STL std::sort() függvény alapja a legtöbb modern fordítóban (pl. GCC, LLVM).
🏗️ Hogyan működik?
- Quicksort-al kezd: oszd meg és uralkodj stratégia.
- Mély rekurzió esetén átvált Heapsort-ra, hogy megelőzze a teljesítményromlást.
- Kis szegmenseknél Insertion Sort-ot használ, mert az gyorsabb a kis méret miatt.
🎯 A döntési kritérium:
- A maximális rekurzió mélység .
- Ha ezt túllépi, akkor áttér Heapsort-ra.
📈 Algoritmus lépések
- Kezdés: Introsort(A, begin, end, depth_limit)
- Ha (end - begin) < threshold → Insertion sort
- Ha depth_limit == 0 → Heapsort
- Egyébként → válassz pivotot, QuickSort rekurzív hívása bal és jobb részhalmazra
- A rendezés végén a maradék kis tömbökön Insertion sort
🧮 Időbonyolultság
| Eset | Bonyolultság |
|---|---|
| Legjobb eset | |
| Átlagos eset | |
| Legrosszabb eset |
Ezért a Quicksort + Heapsort kombinációjával minden esetben garantált a jó teljesítmény.
💡 Miért jobb, mint simán a Quicksort?
A sima Quicksort legrosszabb esetben (pl. ha mindig a legkisebb/legnagyobb elemet választja pivotnak) időt vehet igénybe.
Az Introsort felismeri, ha ez a helyzet kialakulóban van, és gyorsan vált a Heapsort-ra, amely mindig .
🛠️ Implementáció (pszeudokód)
void introsort(std::vector<int>& arr) {
int depth_limit = 2 * log2(arr.size());
introsort_util(arr, 0, arr.size() - 1, depth_limit);
}
void introsort_util(std::vector<int>& arr, int begin, int end, int depth_limit) {
int size = end - begin + 1;
if (size < 16)
insertion_sort(arr, begin, end);
else if (depth_limit == 0)
heapsort(arr, begin, end);
else {
int pivot = partition(arr, begin, end);
introsort_util(arr, begin, pivot - 1, depth_limit - 1);
introsort_util(arr, pivot + 1, end, depth_limit - 1);
}
}
🔎 In-depth: Mikor vált?
A váltás akkor történik, ha a rekurzió mélysége túl nagy, ami azt jelenti, hogy a partíciók túl asszimetrikusak – ez a Quicksort Achilles-sarka.
Az Introsort tehát „önreflexív”: ha úgy látja, hogy baj van, stratégiát vált.
💬 Valós használat
std::sort()C++-ban: introsort alapú.- LLVM libc++, GNU libstdc++: introsort implementációt használnak.
- Java SE 7+: a
Arrays.sort()primitíveken Introsort-szerű viselkedést mutat.
🧪 Összehasonlítás más algoritmusokkal
| Algoritmus | Átlagos idő | Legrosszabb idő | In-place | Stabil |
|---|---|---|---|---|
| Quicksort | ✔️ | ❌ | ||
| Heapsort | ✔️ | ❌ | ||
| Mergesort | ❌ | ✔️ | ||
| Introsort | ✔️ | ❌ |
📦 Összefoglalás
Az Introsort:
- Hibrid, robusztus, gyors,
- Gyakorlatban jól működik,
- Fejlettebb, mint a klasszikus rendezések.
Ezért válik alapértelmezetté a modern C++ programokban, és szinte minden általános célú rendezési problémára ideális.