|  |  |
| --- | --- |
|    | **Šį straipsnį yra pasiūlyta sujungti su „Rikiavimo algoritmas".**Dėl kokių priežasčių palikta ši žymė, galite sužinoti diskusijų puslapyje. |

Dažnai greitam darbui su duomenimis būtina duomenis surikiuoti, bet esant dideliems duomenų kiekiams labai svarbu ir paties **rikiavimo algoritmo sudėtingumas** – atlikimo greičio priklausomybė nuo duomenų kiekio.

Duomenų rikiavimo uždavinys apibrėžiamas taip:

*Turint N elementų seką (a1, a2, …, aN), reikia išdėstyti šiuos elementus taip, kad gautume naują N elementų seką (a1', a2', …, aN'), tenkinančią salygą ai <= aj, kai i<j.*

Problematika
------------

Algoritmų analizėje duomenų rikiavimo problema laikoma pačia svarbiausia, nes tai viena dažniausiai pasitaikančių operacijų programavime. Efektyvus rikiavimo algoritmo pasirinkimas gali turėti netgi lemiamą įtaką programos vykdymo spartai didėjant duomenų kiekiui.

Paprasčiausių rikiavimo algoritmų (išrinkimo rikiavimo algoritmas, įterpimo rikiavimo algoritmas, burbulo metodas) sudėtingumas yra kvadratinis (žymima *O*(*N*²). Dažnai greičiausiu laikomo greitojo rikiavimo (quicksort) algoritmo sudėtingumas daugeliu atveju yra O(N log N), tačiau rikiuojant beveik surikiuotus duomenis, šio algoritmo sudėtingumas siekia O(N²).

Algoritmo sudėtingumas svarbus tik esant dideliam duomenų kiekiui. Palyginimui pateikiama lentelė kaip skiriasi procesoriaus operacijų skaičius didėjant duomenų kiekiui, naudojant du skirtingus algoritmus – pirmasis naudoja 5 N² operacijų, o antrasis – 20 N log N.

| Duomenų elementųskaičius | Santykinis laikasburbulo algoritmu | Santykinis laikas*quicksort* algoritmu |
| --- | --- | --- |
| 10 | 500 | 200 |
| 100 | 50 000 | 4 000 |
| 1000 | 5 000 000 | 60 000 |
| 10000 | 500 000 000 | 800 000 |

Jei duomenų kiekis nedidelis, mums dažniausiai visiškai nesvarbu, kiek mikrosekundžių bus vykdomas rikiavimas, tačiau esant didesniems duomenų kiekiams šis skirtumas yra milžiniškas. Kita vertus, esant labai mažiems duomenų kiekiams efektyvesnis bus burbuliuko metodas. Taip pat algoritmų sudėtingumas priklauso nuo duomenų savybių. Pavyzdžiui, burbuliuko metodas bus daug greitesnis, jei bus bandoma rikiuoti surikiuotus duomenis – tada jo sudėtingumas yra O(n).

Dažniausiai matuojamas algoritmų sudėtingumas vidutiniu atveju, dažnai blogiausiu atveju ir tik kartais – geriausiu. Tas pats algoritmas, būdamas labai greitas geriausiu atveju, gali būti labai blogas vidutiniu ar blogiausiu atveju.

Pagrindiniai algoritmų kursuose pateikiami rikiavimo algoritmai ir jų sudėtingumas (vertinant palyginimo operacijų atžvilgiu):

Algoritmų sudėtingumų lentelė
-----------------------------

| Algoritmas | Blogiausias | Vidutinis | Geriausias | Pastabos |
| --- | --- | --- | --- | --- |
| Skaitmeninis*radixsort* | O(2d N) | O(2d N) | O(2d N) | Tik skaitmeninėms teigiamoms duomenų reikšmėms, kur d yra skaitmenų sk. Reikalauja papildomos atminties |
| Greitojo rikiavimo (*quicksort*) | O(N²) | O(N log N) | O(N log N) | Beveik nenaudoja papildomos atminties |
| Kombinuotas | O(N log N) | O(N (log N)²) |  |  |
| Krūvos (*heapsort*) | O(N log N) | O(N log N) | O (N log N) |  |
| Šelo (*Shell sort*) | O(N²) | O(N1,2) | O(N) |  |
| Sąlajos(*mergesort*) | O(N log N) | O(N log N) | O(N log N) | Stabilus, naudoja papildomą atmintį. Tinka kai nevisus duomenis iškarto galime nuskaityti į operatyvią atmintį |
| Burbulo (*bubble*) | O(N²) | O(N²) | O(N) |  |
| Įterpimo (*insertion*) | O(N²) | O (N²) | O(N) |  |
| Išrinkimo (*selection*) | O(N²) | O(N²) | O(N²) |  |

Lygiagretieji algoritmai
------------------------

Naudojant daugiaprocesorinį kompiuterį ar paskirstytą kompiuterių tinklą galima pasiekti ir dar geresnių rezultatų. Geriausiu atveju pasiekiamas sudėtingumas O((log N)²).

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| Ž • A • RInformatikos sritys |
| --- |
|  |
| Matematinė bazė | 
Būlio (logikos) algebra • Diskrečioji matematika • Grafų teorija • Informacijos teorija • Tikimybių teorija • Statistika |
|  |
| Teorinė informatika | 
Algoritminė informacijos teorija • Tiuringo mašina • Kriptografija • Algoritmų bei jų sudėtingumo tyrimai • Matematinė logika • Formalios kalbos • Tipų teorija • Rikiavimo algoritmų sudėtingumas |
|  |
| Taikomoji informatika | 
Bioinformatika • Geoinformatika • Ekonominė informatika • Neuroinformatika |
|  |
| Programinė įranga | 
Lygiagretusis programavimas • Programų specifikavimas • Programų patikrinimas • Programavimo technika • Programavimo kalbos • Operacinės sistemos • Kompiliatoriai (leksinė analizė) |
|  |
| Programų inžinerija | 
Optimizavimas • Programų metrikos • Konfigūracijų valdymas • Funkcinis programavimas • Struktūrinis programavimas • Objektinis programų kūrimas • Komponentinis programavimas • Šablonai • Atviras kodas |
|  |
| Duomenų ir informacijos sistemos | 
Duomenų struktūros • Duomenų vaizdavimas • Duomenų suspaudimas • Bylos • Bylų formatai • Informacinės sistemos • Duomenų bazės • Informacijos saugojimas |
|  |
| Skaičiavimo metodologijos | 
Dirbtinis intelektas • Kompiuterinė grafika • Vaizdų apdorojimas • Balso atpažinimas • Modeliavimas • Dokumentų ir teksto apdorojimas • Skaitmeninių signalų apdorojimas |

 |