[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