Compararea algoritmului de sortare
algoritmii de sortare sunt o parte importantă a gestionării datelor. AtCprogramming.com, oferim tutoriale pentru înțelegerea celor mai importante șitehnici comune de sortare. Fiecare algoritm are puncte forte șislăbiciuni și, în multe cazuri, cel mai bun lucru de făcut este să folosiți funcția qsorting încorporată. Pentru momentele în care aceasta nu este o opțiune sau aveți nevoie doar de un algoritm de sortare rapid și murdar, există o varietate de opțiuni.
majoritatea algoritmilor de sortare funcționează prin compararea datelor sortate. În unele cazuri, poate fi de dorit să sortați o bucată mare de date (de exemplu, astruct care conține un nume și o adresă) pe baza doar a unei porțiuni din aceste date.Bucata de date utilizată efectiv pentru a determina ordinea sortată se numește cheie.
algoritmii de sortare sunt de obicei judecați după eficiența lor. În acest caz, eficiența se referă la eficiența algoritmică pe măsură ce mărimea intrării crește și se bazează în general pe numărul de elemente de sortat. Majoritatea algoritmilor utilizați au o eficiență algoritmică fie A O(N^2) orO(n*log (n)). Câțiva algoritmi de caz special(un exemplu este menționat în Perle de programare) pot sorta anumite seturi de date mai repede decât O(n*log (n)). Thesalgoritms nu se bazează pe compararea elementelor fiind sortate și se bazează petrucuri. S-a demonstrat că niciun algoritm de comparare a cheilor nu poate funcționa mai bine decât O(n*log(n)).
mulți algoritmi care au aceeași eficiență nu au aceeași viteză peaceeași intrare. În primul rând,algoritmii trebuie judecați pe baza cazului mediu, a celui mai bun caz și a eficienței celui mai rău caz. Unii algoritmi,cum ar fi Quick sort, funcționează excepțional de bine pentru unele intrări, dar oribil pentru alții. Altealgoritmi, cum ar fi sortare îmbinare, nu sunt afectate de ordinea datelor de intrare.Chiar și o versiune modificată a bubble sort se poate termina în O (n) pentru intrările mostfavorable.
un al doilea factor este „termenul constant”. Pe măsură ce notația big-O abstractizează multedin detaliile unui proces, este destul de util pentru a privi imaginea mare. Dar un lucru care este abandonat este constanta din fața expresiei: de exemplu, O(c*n) este doar o(n). În lumea reală, theconstant, c, va varia în funcție de diferiți algoritmi. Un bine implementatquicksort ar trebui să aibă un multiplicator constant mult mai mic decât sortarea heap.
un al doilea criteriu pentru judecarea algoritmilor este cerința lor de spațiu – necesită spațiu de zgârieturi sau poate fi sortată matricea în loc (fără memorie suplimentară dincolo de câteva variabile)? Unii algoritmi nu necesită niciodată spațiu suplimentar, în timp ce unii sunt cel mai ușor de înțeles atunci când sunt implementați cu spațiu suplimentar (sortarea heap, de exemplu, se poate face în loc, dar conceptual este mult mai ușor să te gândești la o grămadă separată). Cerințele de spațiu pot chiar să depindă de structura de date utilizată (merge sort on arrays versus merge sort onlinked lists, de exemplu).
un al treilea criteriu este stabilitatea-acest tip păstrează ordinea cheilor cu valori egale? Cele mai multe soiuri simple fac doar acest lucru, dar unele soiuri, cum ar fisort ieftin, nu.
graficul de mai jos compară algoritmi de sortare pe diferite criteriiaoutlined de mai sus; algoritmii cu termeni constanți mai mari apar mai întâi, deși acesta este în mod clar un concept dependent de implementare și ar trebui să fie luat doar ca un ghid dur atunci când alegeți între tipuri de aceeași eficiență big-O.
Time | ||||||||
---|---|---|---|---|---|---|---|---|
Sort | Average | Best | Worst | Space | Stability | Remarks | ||
Bubble sort | O(n^2) | O(n^2) | O(n^2) | Constant | Stable | Always use a modified bubble sort | ||
Modified Bubble sort | O(n^2) | O(n) | O(n^2) | Constant | Stable | Stops after reaching a sorted array | ||
Selection Sort | O(n^2) | O(N^2) | O(N^2) | constantă | stabilă | chiar și o intrare perfect sortată necesită scanarea întregii matrice | ||
Sortare inserție | O(N^2) | O(n) | O(N^2) | O (n) | O(n ^ 2) | constant | stabil | în cel mai bun caz(deja sortat), fiecare Inserare necesită timp constant |
heap sort | o(n*log(n)) | o(n*log(n)) | o (n*log (n)) | o (n * log (n)) | constant | instable | prin utilizarea matrice de intrare ca stocare pentru heap, este posibil să se realizeze spațiu constant | |
merge sortare | o(n*log(n)) | O(n*log(n)) | O(n*log(n)) | depinde | stabil | pe matrice, sortare îmbinare necesită o(n) spațiu; pe liste legate, sortare îmbinare necesită spațiu constant | ||
Quicksort | o(n*log(n)) | o(n*log(n)) | o(n^2) | constant | stabil | alegerea aleatorie a unei valori pivot (sau amestecarea matricei înainte de sortare) poate ajuta la evitarea scenariilor cel mai rău caz, cum ar fi o matrice perfect sortată. |