[Powered by Google Translate] [BUBBLE SORT]
[JACKSON STEINKAMP Harvard University]
[THIS IS CS50. CS50TV]
Bubble Sort je příklad třídění algoritmu -
to znamená, že postup pro třídění sadu prvků v
vzestupně nebo sestupně.
Například, pokud jste chtěli třídit pole skládající se z čísel
[3, 5, 2, 9], by správné provádění Bubble Seřadit vrátí
seřazené pole [2, 3, 5, 9] ve vzestupném pořadí.
Teď, budu vysvětlovat v pseudokódu, jak algoritmus funguje.
>> Řekněme, že máme řazení seznamu celých čísel 5 - 3, 2, 9, 6, a 5.
Algoritmus začíná při pohledu na první dva prvky, 3 a 2,
a kontrolovat, zda jsou mimo provoz vzhledem k sobě.
Jsou - 3 je větší než 2.
Chcete-li být ve vzestupném pořadí, měly by být naopak.
Takže, vyměníme je.
Nyní seznam vypadá následovně: [2, 3, 9, 6, 5].
>> Dále se podíváme na druhé a třetí prvků, 3 a 9.
Jsou ve správném pořadí vzhledem k sobě navzájem.
To znamená, že 3 je menší než 9 tak, algoritmus není vyměnit je.
Dále se podíváme na 9 a 6. Jsou mimo provoz.
>> Takže, musíme vyměnit, protože 9 je větší než 6.
Konečně se podíváme na posledních dvou celých čísel, 9 a 5.
Jsou mimo provoz, a proto musí být vyměněn.
Po prvním kompletním průchodu seznamu,
vypadá následovně: [2, 3, 6, 5, 9].
Není to špatné. Je to skoro seřazeny.
Ale musíme projít seznam znovu, aby si to úplně seřazeny.
Dva je menší než 3, takže ne vyměnit je.
>> Tři je menší než 6, takže ne vyměnit je.
Šest je větší než 5. My vyměnili.
Šest je menší než 9. Nechceme vyměnit.
Po druhém průchodu, to vypadá takto: [2, 3, 5, 6, 9]. Perfect.
Nyní, pojďme napsat, že v pseudokódu.
V podstatě, pro každý prvek v seznamu, musíme se na to podívat
a prvek přímo k jeho pravé straně.
Pokud jsou mimo provoz ve vztahu k sobě - ​​to znamená, že v případě, že prvek vlevo
je větší než na pravé straně - bychom měli vyměnit dva prvky.
>> Děláme to pro každý prvek seznamu, a udělali jsme jeden průchod přes.
Teď jen musíme dělat pass-through tolikrát, aby seznam
je plně řádně seřazeny.
Ale kolikrát musíme projít v seznamu
zaručit, že jsme udělali?
No, nejhorší scénář je, pokud budeme mít úplně dozadu seznam.
Pak se množství složit průchodek, která se rovná počtu
prvků n-1.
Pokud to nedává smysl intuitivně, myslet na jednoduchém případě - seznam [2, 1].
>> To bude trvat jeden pass-through třídit správně.
[3, 2, 1] - v nejhorším případě je to, že se 3 prvky seřazeny dozadu,
to bude trvat 2 iterací seřadit.
Po jedné iterace, je to [2, 1, 3].
Druhý výnosy seřazené pole [1, 2, 3].
Takže víte, že nikdy nebudete muset jít přes pole, obecně,
více než n-1 krát, kde n je počet prvků v poli.
Je to tzv. Bubble Sort, protože největší prvky mají tendenci k "bubble-up"
doprava docela rychle.
Ve skutečnosti, tento algoritmus má velmi zajímavé chování.
>> Po m iteracích přes celé pole,
nejvíce vpravo m prvky jsou zaručeny
které mají být tříděny do jejich správné místo.
Pokud chcete vidět to pro sebe,
můžeme vyzkoušet na úplně dozadu seznamu [9, 6, 5, 3, 2].
Po jednom průchodu celého seznamu,
[Zvuk psaní]
[6, 9, 5, 3, 2], [6, 5, 9, 3, 2], [6, 5, 3, 9, 2], [6, 5, 3, 2, 9]
zcela vpravo element 9 je na svém místě.
Po druhém pass-through, bude mít 6 "bublal-up" na
druhé nejpravější místo.
Tyto dva prvky na pravé straně - 6 a 9 - bude v jejich správných místech
po prvních dvou Pass-průchodek.
>> Takže, jak můžeme použít k optimalizaci algoritmu?
No, po jedné iterace přes pole
nemáme vlastně třeba zkontrolovat úplně vpravo prvek
protože víme, že to jsou seřazena.
Po dvou iteracích, víme jistě nejvíce vpravo dva prvky jsou na svém místě.
Takže, obecně po kv iteracích přes celou řadou,
Kontrola poslední K prvků je nadbytečná, protože víme,
jsou na správném místě již.
>> Takže pokud jste třídění pole n prvků,
na první iteraci - budeš muset vyřešit všechny prvky - první N-0.
Na druhé iteraci, budete se muset podívat na všechny prvky, ale poslední -
prvních n-1.
Další optimalizace může být zjistit, zda je seznam již řazeno
po každé iteraci.
Pokud je to již řazeno, nepotřebujeme, aby se žádné další iterace
v seznamu.
Jak to můžeme udělat?
No, pokud nebudeme dělat žádné swapy na promítání v seznamu,
je jasné, že seznam byl již řazeno, protože jsme neměli zaměnit nic.
Takže jsme rozhodně nemusíme řadit znovu.
>> Možná byste mohli inicializovat vlajky proměnnou s názvem "není seřazena" na
false a změnit jej na hodnotu true, pokud máte vyměnit jakékoli prvky na
jedna iterace přes pole.
Nebo podobně, aby se čítač počítat, kolik swapy uděláte
na dané iteraci.
Na konci iterace, pokud nebyla vyměnit některý z prvků,
víte, seznam je již seřazena a máte hotovo.
Bubble Sort, stejně jako ostatní metody řazení, může být
vylepšený pracovat pro všechny prvky, které mají uspořádání metody.
>> To je vzhledem k tomu, dva prvky máte způsob, jak říct, pokud první
je větší než, roven nebo menší než druhé.
Například byste mohli řadit písmena abecedy vyslovením
že a <b, b <c, atd.
Nebo byste mohli řadit dny v týdnu, kdy je neděle méně do pondělí
která je menší než úterý.
>> Bubble Sort není v žádném případě velmi efektivní, nebo rychle třídění algoritmus.
Jeho nejhorší runtime je Big O n ²
protože budete muset provést n iterací pomocí seznamu
kontrolu všech n prvků každé pass-through, nxn = n ².
To běží čas znamená, že počet prvků jste třídění zvýšení,
doba chodu zvyšuje kvadraticky.
>> Ale pokud účinnost není velkým problémem vašeho programu
nebo pokud jste jen řazení malý počet prvků,
můžete najít Bubble Sort užitečné, protože
je to jedna z nejjednodušších algoritmů třídění pochopit
a kód.
Je to také skvělý způsob, jak získat zkušenosti s překládáním teoretické
algoritmus do skutečného fungování kódu.
No, to je Bubble Sort pro vás. Díky za sledování.
CS50.TV