Sortiranje mehurom — разлика између измена

Садржај обрисан Садржај додат
spajanje
Ред 1:
{{Infobox Algorithm-lat
{{Neprovereni seminarski}}
|class=[[Algoritam sortiranja]]
{{спајање|Баблсорт}}
|image=[[Датотека:Bubblesort-edited-color.svg|frame|SortiranjeVizuelna mehurompredstava bablsort algoritma<br />|thumb|center]]
|data=[[Array data structure|Niz]]
'''Sortiranje mehurom''' ({{jez-eng-lat|Bubble sort}}), ponekad pogrešno nazivan '''sinking sort''', je jednostavan [[Алгоритми сортирања|algoritam za sortiranje]] koji radi tako što više puta prolazi kroz niz koji treba da bude sortiran i upoređuje se svaki par susednih elemenata. Elementi zamenjuju mesta ako su napisani pogresnim redom. Prolaz kroz niz se ponavlja se dok se ne izvrše sve potrebne zamene, što ukazuje da je niz sortiran. Algoritam je dobio ime zbog načina na koji najmanji elemenat „bubble“ dolazi na početak niza. Pošto se samo porede elementi, ovo je [[komparativno sortiranje]]. Iako je ovo jednostavan algoritam, većina drugih algoritama za sortiranje su efikasniji za velike nizove.
|best-time= <math>O(n)</math>
|average-time= <math>O(n^2)</math>
|time=<math>O(n^2)</math>
|space=<math>O(1)</math>
|optimal=No
}}
 
'''Sortiranje mehurom''' ili ''Bablsort'' ({{jez-eng-lat|Bubble sort}}), ponekad pogrešno nazvano ''potapajuće sortiranje'', [[algoritam]] je koji se koristi za [[Algoritmi sortiranja|sortiranje nizova]]. Algoritam radi tako što upoređuje svaka dva susedna člana niza i zamenjuje im mesta, ako su članovi niza u pogrešnom redosledu. Prolazi se kroz niz elemenata sve dok se ne izvrši nijedna zamena tj. elementi su sortirani u odgovarajućem poretku (rastućem ili opadajućem). Naziv vodi poreklo od činjenice da se posle prve iteracije kroz niz najveći element nalazi na najvećoj poziciji u nizu, tj. na desnoj strani niza. Algoritam je veoma lak za implementaciju u svim programskim jezicima, ali je veoma nepraktičan i spor čak i kada se uporedi sa algoritmom kao što je [[Sortiranje umetanjem|sortiranje umetanjem]].<ref name="Knuth">{{cite book |author= Donald Knuth |volume= 3: ''Sorting and Searching'' |edition= Second |publisher= Addison-Wesley |date= 1998 |id= ISBN 0-201-89685-0 |pages= 106-110 |title= [[The Art of Computer Programming]], section 5.2.2: Sorting by Exchanging |quote= "[A]lthough the techniques used in the calculations [to analyze the bubble sort] are instructive, the results are disappointing since they tell us that the bubble sort isn't really very good at all. Compared to straight insertion […], bubble sorting requires a more complicated program and takes about twice as long!" (Quote from the first edition, 1973.) }}</ref> Algoritam radi dobro na nizovima koji ima mali broj elemenata, ili koji su polusortirani, tj. samo određeni broj elemenata je na nepravilnim pozicijama.
 
== Analiza ==
[[Датотека:Bubble-sort-example-300px.gif|300px|мини|right|Primer bubble sorta. Polazi se od početka niza, uproredjuje svaki susedni par i menja njihov položaj, ako nisu u pravom redosledu (sledeći je manji od prethodnog). Posle svake iteracije, upoređuje se jedan element manje, sve dok više ne postoje elementi koje treba upoređivati.]]
 
=== PERFORMANSEPerformanse ===
Bubble sortBablsort ima najgoru složenost ''[[big o notation|О]]''(-{''n''}-<sup>2</sup>), gde je -{''n''}- broj elemenata koji se sortiraju. Postoji mnogo algoritama za sortiranje koji imaju znatno bolju složenost -{''O''(''n''&nbsp;log&nbsp;''n'')}-. Čak i drugi algoritimi složenosti -{''О''(''n''<sup>2</sup>)}-, kao što je [[sortiranje umetanjem|insertion sort]], imaju tendenciju da imaju bojebolje performanse od bubble sortabablsorta. Dakle, bubblesortiranje sortmehurom nije praktičan algoritam za sortiranje kada je -{''n''}- veliko.
 
Jedina značajna prednost bubble sortabablsorta za razliku od drugih implementacija, čak i [[квиксорт|quicksortakviksort]]a, ali ne [[sortiranje umetanjem|insertionsortiranja sortaumetanjem]], je sposobnost da otkrije da je sortiran niz efikasno ugrađen u algoritam. Složenost bubble sortabablsorta nad već sortiranim nizovima (u najboljem slučaju) je -{''O''(''n'')}-. Nasuprot tome, većina drugih algoritama, čak i oni sa boljom prosečnom složenošću, obavljaju ceo proces sortiranja na setu i na taj način su složeniji. Međutim, ne samo da insertion sort ima ovaj mehanizam, već i bolje radi na nizu koji je znatno sortiran (mali broj [[inverzija]])
 
=== Zečevi i kornjače ===
Pozicije elemenata u bubble sortubablsortu igraju veliku ulogu u određivanju složenosti. Veliki elementi na početku niza ne predstavljaju problem jer se brzo zamene. Mali elementi pri kraju niza se kreću na početak veoma sporo. Zbog toga se ove vrste elemenata respektivno nazivaju zečevi i kornjače.
 
Učinjeni su razni napori daseda se eliminišu kornjače kako bi se poboljšala brzina bubble sortabablsorta. [[CocktailKoktel sortiranje|Koktelsort]] sort je dvosmerni bubble sortbablsort koji idiide od početka do kraja, a onda se poništava i ide od kraja do početka. On može da se pomera kornjače prilično dobro, ali zadržava složenost ''[[Велико О|-{O(n<sup>2</sup>)}-]]''. [[Comb sort|Kombsort]] poredi elemente razdvojene velikim prazninama, a može da pomera kornjače izuzetno brzo pre nego što pređe na manje praznine. Njegova prosečna brzina se može uporediti sa brzim algoritmima kao što je [[квиксорт|quicksortkviksort]].
 
=== Korak po korak primer ===
 
Niz brojeva "5 1 4 2 8" potrebno je sortirati od najmanjeg do najvećeg broja (u rastućem poretku) pomoću bubble sort-abablsorta. U svakom koraku '''boldirani elementi''' se upoređuju. Biće potrebna tri prolaska kroz niz:
 
 
Линија 71 ⟶ 80:
end procedure
</source>
Da podsetimo, postoje bolji algoritmi za sortiranje kao što je [[квиксорт|quicksortkviksort]] koji se obično koriste, a većina programskih jezika ima ugrađenu funkciju u standardnoj biblioteci koja se može koristiti umesto da se implementira sopstveni algoritam za sortiranje.
 
=== Optimizacija bubble sorta ===
Bubble sortBablsort algoritam se može lako opimizovati posmatranjem, ako opazimose uoči da -{n}--ti prolaz pronalazi -{n}--ti najveći element i stavlja ga na njegovo mesto. Dakle, unutrašnja petlja može da se izbegne gledajući poslednjih -{n}--1 elemenata kada radi za -{n}--ti put:
 
<source lang="pli">
Линија 92 ⟶ 101:
</source>
 
Uopšteno, može se desiti da se više od jednog elementa nalazi u završnoj poziciji u jednom prolazu. Konkretno, posle svakog prolaza, svi elementi do poslednje zamene su sortirani i ne treba ih ponovo proveravati. To nam omogućava da se presoči mnogo elemenata, što dovodi do u najgorem slučaju 50% poboljšanja i dodaje malo složenosti, jer novi kod podvodi “zamenljiva”„zamenljiva” promenljiva:
 
 
Линија 112 ⟶ 121:
</source>
 
Alternativne modifikacije, kao što je [[cocktailkoktel shaker sortsortiranje]] metoda pokušaji su da se poboljša bubble sort zadržavajući istu ideju (više puta se prede elementi i zamena susednih elemenata)
 
== U praksi ==
[[Датотека:Bubble sort animation.gif|мини|right|280px|Bubble sortBablsort, algoritam za sortiranje koji stalno prolazi kroz niz, zamenjuje mesta elementima dok se ne pojave u ispravnom redosledu. Treba zapaziti da se prvo sortiraju najveći elementi, a zatim manji.]]
Iako je bubble sortbablsort jedan od najjednostavnijih algoritama za sortiranje potrebno je razumeti i njegovu primenu. Njegova složenost ''[[Велико О|-{O(n<sup>2</sup>)}-]]'' znači da se njegova efikasnost smanjuje dramatično na nizovima koji imaju veći broj elemenata. Čak i medjumeđu jednostavnim -{''O(n<sup>2</sup>)''}- algoritmima, algoritmi poput [[insertionsortiranje umetanjem |sortiranja sortaumetanjem]] su znatno efikasniji.
 
Zbog svoje jednostavnosti, bubble sortbablsort se često koristi da se uvede koncept algoritama ili algoritam za sortiranje na uvodnim predavanjima studentima [[informatike|informatika]]. Međutim, neki istraživači kao što je [[Oven Astrachan |Oven Astračan]] su otišli predaleko omalovažavajući bubble sortbablsort i njegovu popularnost u obrazovanju informatičara preporučujući da se više i ne uči.<ref name="Astrachan2003" />
 
The [[Jargon file]], čiji je poznati naziv [[глупиglupi сорт|bogosortsort]] -{"the archetypical [sic] perversely awful algorithm"}-, takođe naziva bubble sortbablsort '''generički loš algoritam'''.<ref>[http://www.jargon.net/jargonfile/b/bogo-sort.html jargon, node: bogo-sort<!-- Bot generated title -->]</ref> [[Donald Knut]]h u svojoj čuvenoj knjizi ''[[Umetnost računarskog programiranja]]'' zaključio je da se Bubble sortBablsort nema po čemu preporučiti osim po privlacnomprivlačnom imenu i činjenici da voidne oispoljava neke nekihod zanimljivih teorijskih probemaproblema o kojim je on tada govorio.<ref name="Knuth">Donald Knuth. ''[[The Art of Computer Programming]]'', Volume 3: ''Sorting and Searching'', Second Edition. Addison-Wesley. {{page|year=1998|isbn=978-0-201-89685-5|pages=106-110}} of section 5.2.2: Sorting by Exchanging.</ref>
 
Bubble sortBablsort je asimptotski ekvivalentan [[sortiranje umetanjem|insertionsortiranju sortuumetanjem]] po vremenu izvršavanja u najgorem slučaju, ali ova dva algoritma se veoma razlikuju po broju potrebnih zamena (svapova). Eksperimentalni rezultati kao što su oni od AstrachanaAstračana su takođe pokazali da [[sortiranje umetanjem|insertion sort]] radi znatno bolje čak i na slučajnim listama. Iz tih razloga mnogi moderni udžbenici izbegavaju korišćenje algoritma bubble sortabablsorta u korist [[sortiranjesortiranja umetanjem|insertion sorta]].
 
Bubble sortBablsort takođe slabo komunicira sa modernim CPU hardverom. To zahteva najmanje duplo više pisanja nego kod insertion sorta, duplo vise keša, više filijala. Eksperimenti za AstrachanAstračan sortiranje stringova u Javi pokazuje da bubblealgoritam mehura može da bude oko 5 puta sporiji od [[insertonalgoritma sorta]]sa umetanjem i 40% sporiji od [[сортирање селекцијом|selectionselekcionog sortasortiranja]].<ref name="Astrachan2003">Owen Astrachan. Bubble Sort: An Archaeological Algorithmic Analysis. SIGCSE 2003 Hannan Akhtar . [http://www.cs.duke.edu/~ola/papers/bubble.pdf (pdf)]</ref>
 
U kompjuterskoj grafici je popularan zbog njegove sposobnosti da otkrije veoma malu grešku (kao zamenu samo dva elementa) u skorosortiranim nizovima i popraviti je sa linearnom složenošću (-{2n}-).
 
== Varijacije ==
* [[OddSortiranje "par-even sortnepar"]] je paralelna verzija bubble sortabablsorta, za messagesisteme passingrazmene systemsporuka.
* [[CocktailKoktel sortsortiranje]] je paralelna verzija bubble sortabablsorta.
* U nekim slučajevima, sortiranje se vrši sa desna na levo (u suprotnom smeru) koji je pogodniji za delimično sortirane nizove, odnosno nizove sa nesortiranim elementima na kraju.
 
== Pogrešan naziv ==
Bubble sortBablsort se pogrešno naziva sinkingpotapajuće sortsortiranje. SinkingPotapajuće sortsortiranje je ispravan pseudonim za insertionsortiranje sa sortumetanjem. Ova greška je uglavnom poštonastala kad je Nacionoalni institut za standarde i tehnologiju naveo sinking sort kaotaj pseudonim za bubble sortbablsort. U knjizi [http://xlinux.nist.gov/dads/HTML/bubblesort.html] DonaldDonalda KnuthKnuta „Umetnost kompjuterskog programiranja“, tom3tom 3: ''sortiranja i pretrage'', Donalon Knuth kaženavodi u odeljku 5.2.1 „ sortiranje„sortiranje metodom insertion sortumetanja rešava problem na svom pravom nivou“. Ovaj metod je često nazivan ''sinking'' sort. Pored toga, veće vrednosti se mogu smatrati kao teže i zbog toga one postepeno „tonu“ na dno liste, što je dovelo do toga da se pogrešno upotrebljava ovaj naziv.
 
Da pojasnimo, možemo posmatrati ponašanje 2 algoritama. U bubble sortu, veći mehurići (više vrednosti) će isplivati zamenjujući manje mehuriće (niže vrednosti). Insertion sort, sa druge strane, potapa svaku sledeću vrednost do svog mesta u sortiranom delu niza.
 
== Reference ==
Линија 142 ⟶ 149:
 
== Literatura ==
{{refbegin}}
* {{cite book|author=[[Donald Knut]]h|title=The Art of Computer Programming|location=Volume 3|publisher=''Sorting and Searching'', Third Edition. Addison-Wesley|year=1997|isbn=978-0-201-89685-5|pages=106-110}} of section 5.2.2: Sorting by Exchanging.
* {{cite book|author=[[Thomas H.Donald Cormen]],Knuth [[Charles E. Leiserson]], [[Роналд Лин Ривест|Ronaldtitle=The L.Art Rivest]],of andComputer [[Clifford Stein]]Programming|titlelocation=[[IntroductionVolume to Algorithms]]|location=3|publisher=Second''Sorting Edition.and MITSearching'', PressThird andEdition. McGrawAddison-HillWesley|year=20011997|isbn=978-0-262201-0329389685-35|pages=106-110}} Problemof section 5.2-.2,: pg.38Sorting by Exchanging.
* {{cite book|author= Thomas H. Cormen |author2= Charles E. Leiserson |author-link3= Роналд Лин Ривест |author3= Ronald L. Rivest |author4= Clifford Stein |title=[[Introduction to Algorithms]]|location=|publisher=Second Edition. MIT Press and McGraw-Hill|year=2001|isbn=978-0-262-03293-3|pages=}} Problem 2-2, pg.38.
* [https://www.cs.tcd.ie/publications/tech-reports/reports.05/TCD-CS-2005-57.pdf Sorting in the Presence of Branch Prediction and Caches]
* {{cite book|author=Ellis Horowitz, [[|author2= Sartaj Sahni]] and|author3= Susan Anderson-Freed |title=Fundamentals of Data Structures |publisher=|location= |year=|isbn=978-81-7371-605-8|pages=}}
* Алгоритми и структуре података - Мило Томашевић
* Увод у програмирање - Милан Шкарић
{{refend}}
 
== Spoljašnje veze ==
Линија 153 ⟶ 164:
* {{cite web | url=https://www.toptal.com/developers/sorting-algorithms |title = Animated Sorting Algorithms: Bubble Sort |last=Toptal}} – -{graphical demonstration and discussion of bubble sort}-
* {{cite web | url= http://lecture.ecc.u-tokyo.ac.jp/~ueda/JavaApplet/BubbleSort.html |title= Lafore's Bubble Sort}} (Java applet animation)
 
{{Authority control-lat}}
 
[[Категорија:Алгоритми сортирања]]
[[Категорија:Низови]]
[[Категорија:Сортирање поређењем]]
[[Категорија:Стабилно сортирање]]