Bublinkové triedenie (bubble sort)

  • Informatika
  • algoritmy triedenia
  • časová zložitosť
  • priestorová zložitosť
  • Big O notácia
  • optimalizácia algoritmov
  • štúdium algoritmov

Podcast

Bublinkové triedenie0:00 / 11:29
0:001:00 zostáva

Bublinkové triedenie (angl. Bubble Sort) je jedným z najzákladnejších triediacich algoritmov, ktorý slúži ako vynikajúci úvod do sveta algoritmov a ich analýzy. Hoci je na prvý pohľad jednoduchý na pochopenie a implementáciu, pre väčšie súbory dát je pomerne neefektívny. Tento komplexný rozbor bublinkového triedenia vám pomôže pochopiť jeho princípy, zložitosť, optimalizácie a prečo je dôležité ho študovať.

Bublinkové Triedenie: Základné Princípy a Fungovanie

Bublinkové triedenie pracuje na princípe opakovaného prechádzania zoznamom a porovnávania susedných prvkov. Ak sú prvky v nesprávnom poradí (napríklad pri vzostupnom triedení je prvý väčší ako druhý), vymenia sa. Tento proces sa neustále opakuje, až kým nie je celý zoznam usporiadaný.

Po každom prechode zoznamom sa najväčší (alebo najmenší) netriedený prvok presunie na svoju konečnú pozíciu. Tento jav, kedy sa prvky „prebublávajú“ na správne miesta, dal algoritmu jeho charakteristický názov.

Ako Prebiehajú Prechody Algoritmom?

Algoritmus bublinkového triedenia vyžaduje viacero prechodov (iterácií) cez zoznam s n prvkami. V každom prechode sa vykonáva séria porovnaní a prípadných výmen:

  1. Prvý prechod: Algoritmus začína porovnávaním prvého a druhého prvku, následne druhého a tretieho, a tak ďalej, až po (n-1)-tý a n-tý prvok. Po dokončení prvého prechodu je zaručené, že najväčší prvok v zozname sa nachádza na poslednej pozícii. Táto pozícia je už "triedená" a v ďalších prechodoch sa s ňou už nepracuje.
  2. Druhý prechod: Algoritmus opäť prechádza zoznamom, ale tentoraz len po (n-1)-tú pozíciu, pretože n-tá pozícia už obsahuje správny prvok. Po dokončení tohto prechodu bude druhý najväčší prvok na (n-1)-tej pozícii.
  3. Ďalšie prechody: Tento proces sa opakuje. V každom prechode sa počet porovnávaných prvkov znižuje o jeden, pretože jeden prvok je už na svojej správnej pozícii. Celkovo je potrebných (n-1) prechodov na úplné usporiadanie zoznamu.

Príklad Krok za Krokom: Bublinkové Triedenie (Bubble Sort)

Ukážme si bublinkové triedenie na príklade zoznamu čísel [5, 1, 4, 2, 8]. Cieľom je usporiadať zoznam vzostupne. Počet prvkov (n) je 5.

Počiatočný zoznam: [5, 1, 4, 2, 8]

Prvý prechod (i = 0): Porovnávame prvky od začiatku po predposledný (index 3).

  • Porovnať 5 a 1: 5 > 1, vymeniť. Zoznam: [1, 5, 4, 2, 8]
  • Porovnať 5 a 4: 5 > 4, vymeniť. Zoznam: [1, 4, 5, 2, 8]
  • Porovnať 5 a 2: 5 > 2, vymeniť. Zoznam: [1, 4, 2, 5, 8]
  • Porovnať 5 a 8: 5 < 8, nevymeniť. Zoznam: [1, 4, 2, 5, 8]

Po prvom prechode je najväčší prvok (8) na správnej pozícii na konci zoznamu. Zoznam po prvom prechode: [1, 4, 2, 5, 8]

Druhý prechod (i = 1): Porovnávame prvky od začiatku po index 2.

  • Porovnať 1 a 4: 1 < 4, nevymeniť. Zoznam: [1, 4, 2, 5, 8]
  • Porovnať 4 a 2: 4 > 2, vymeniť. Zoznam: [1, 2, 4, 5, 8]
  • Porovnať 4 a 5: 4 < 5, nevymeniť. Zoznam: [1, 2, 4, 5, 8]

Po druhom prechode je druhý najväčší prvok (5) na správnej pozícii. Zoznam po druhom prechode: [1, 2, 4, 5, 8]

Tretí prechod (i = 2): Porovnávame prvky od začiatku po index 1.

  • Porovnať 1 a 2: 1 < 2, nevymeniť. Zoznam: [1, 2, 4, 5, 8]
  • Porovnať 2 a 4: 2 < 4, nevymeniť. Zoznam: [1, 2, 4, 5, 8]

Po treťom prechode je tretí najväčší prvok (4) na správnej pozícii. Zoznam po treťom prechode: [1, 2, 4, 5, 8]

Štvrtý prechod (i = 3): Porovnávame prvky od začiatku po index 0.

  • Porovnať 1 a 2: 1 < 2, nevymeniť. Zoznam: [1, 2, 4, 5, 8]

Po štvrtom prechode je štvrtý najväčší prvok (2) na správnej pozícii. Zoznam je teraz plne usporiadaný: [1, 2, 4, 5, 8].

Over si, čo už vieš

Test · 20 otázok · prvé 3 zadarmo

Otázka 1 z 30%

Je bublinkové triedenie považované za algoritmus, ktorý na svoju činnosť vyžaduje konštantné množstvo dodatočnej pamäte?

Precvič si to na kartičkách

32 kartičiek · prvé 3 zadarmo bez účtu

1 / 32

Čo je to bublinkové triedenie a aké sú jeho hlavné charakteristiky?

Bublinkové triedenie je jedným z najjednoduchších triediacich algoritmov, ľahko pochopiteľný a implementovateľný, ale neefektívny pre väčšie dátové sú

Ťukni na otočenie · Potiahni na navigáciu

Analýza Zložitosti Bublinkového Triedenia

Analýza zložitosti algoritmov nám pomáha pochopiť, ako sa výkon algoritmu mení s rastúcou veľkosťou vstupných dát. Pre bublinkové triedenie rozlišujeme časovú a priestorovú zložitosť.

Časová Zložitosť (Time Complexity)

Časová zložitosť bublinkového triedenia sa vyjadruje pomocou notácie veľké O (Big O notation).

  • Najhorší prípad (Worst-case): O(n²)

Tento prípad nastáva, keď je zoznam usporiadaný v opačnom poradí (napr. zostupne pri vzostupnom triedení). Algoritmus musí vykonať maximálny počet porovnaní a výmen. Pre zoznam s n prvkami platí:

  • Prvý prechod vykoná (n-1) porovnaní.
  • Druhý prechod vykoná (n-2) porovnaní. *...až po posledný prechod, ktorý vykoná 1 porovnanie.

Celkový počet porovnaní je súčet aritmetickej postupnosti: (n-1) + (n-2) +... + 1 = n * (n-1) / 2. To je približne n²/2 porovnaní. V Big O notácii sa konštantné faktory a členy nižšieho rádu ignorujú, preto je časová zložitosť O(n²).

  • Priemerný prípad (Average-case): O(n²)

Pre náhodne usporiadaný zoznam je priemerný počet porovnaní a výmen tiež úmerný n². Preto je priemerná časová zložitosť tiež O(n²).

  • Najlepší prípad (Best-case): O(n)

Najlepší prípad nastáva, keď je zoznam už usporiadaný. Ak použijeme optimalizáciu (popísanú nižšie), ktorá detekuje, či v prechode nedošlo k žiadnej výmene, algoritmus môže skončiť už po prvom prechode. V takom prípade vykoná len (n-1) porovnaní, čo je lineárna zložitosť O(n).

Priestorová Zložitosť (Space Complexity)

  • O(1)

Bublinkové triedenie je triediaci algoritmus „na mieste“ (in-place). To znamená, že na svoju činnosť potrebuje len minimálne dodatočné miesto v pamäti, nezávislé od veľkosti vstupu. Potrebuje len niekoľko premenných na uloženie indexov a dočasnú premennú na výmenu prvkov. Preto je jeho priestorová zložitosť konštantná, O(1).

Optimalizácia Bublinkového Triedenia

Hoci základná verzia bublinkového triedenia má vždy n-1 prechodov, existujú jednoduché optimalizácie, ktoré môžu výrazne zlepšiť jeho výkon v najlepšom a niekedy aj v priemernom prípade, najmä ak je zoznam už čiastočne alebo úplne usporiadaný.

Optimalizácia s Príznakom Výmeny

Táto optimalizácia zavádza logickú premennú (napr. vymenene), ktorá sa na začiatku každého prechodu nastaví na false. Ak počas prechodu dôjde k akejkoľvek výmene prvkov, premenná vymenene sa nastaví na true. Ak po dokončení celého prechodu zostane vymenene na false, znamená to, že v tomto prechode nedošlo k žiadnej výmene. To indikuje, že zoznam je už plne usporiadaný, a algoritmus môže predčasne ukončiť svoju činnosť. Táto optimalizácia znižuje časovú zložitosť v najlepšom prípade na O(n).

Optimalizácia Skrátenia Vnútorného Cyklu

Ako už bolo spomenuté, po každom prechode sa najväčší prvok presunie na svoju správnu pozíciu na konci netriedenej časti zoznamu. To znamená, že v každom nasledujúcom prechode nemusíme porovnávať prvky, ktoré sú už na svojich konečných pozíciách. Vnútorný cyklus sa teda môže skracovať o počet už usporiadaných prvkov. Táto optimalizácia je už zahrnutá v základnom popise algoritmu, kde vnútorný cyklus ide len po n - i - 1.

Pseudokód a Implementácia

Pre lepšie pochopenie si pozrime pseudokód základnej a optimalizovanej verzie bublinkového triedenia.

Základný Pseudokód Bublinkového Triedenia

PROCEDÚRA bublinkove_triedenie(zoznam)
 n = dĺžka(zoznam)
 PRE i OD 0 DO n - 2 KROK 1
 PRE j OD 0 DO n - i - 2 KROK 1
 AK zoznam[j] > zoznam[j + 1] POTOM
 vymen(zoznam[j], zoznam[j + 1])
 KONIEC AK
 KONIEC PRE
 KONIEC PRE
KONIEC PROCEDÚRY

Pseudokód Optimalizovanej Verzie s Príznakom Výmeny

PROCEDÚRA bublinkove_triedenie_optimalizovane(zoznam)
 n = dĺžka(zoznam)
 PRE i OD 0 DO n - 2 KROK 1
 vymenene = FALSE
 PRE j OD 0 DO n - i - 2 KROK 1
 AK zoznam[j] > zoznam[j + 1] POTOM
 vymen(zoznam[j], zoznam[j + 1])
 vymenene = TRUE
 KONIEC AK
 KONIEC PRE
 AK vymenene == FALSE POTOM
 PRERUŠ CYKLUS
 KONIEC AK
 KONIEC PRE
KONIEC PROCEDÚRY

Implementácia v Pythone

Pre študentov, ktorí preferujú konkrétnu implementáciu, je tu príklad v programovacom jazyku Python.

def bublinkove_triedenie(zoznam):
 n = len(zoznam)
 # Prechádzame celým zoznamom n-1 krát
 for i in range(n - 1):
 # Posledných i prvkov je už na svojom mieste
 for j in range(n - 1 - i):
 # Porovnávame susedné prvky
 if zoznam[j] > zoznam[j + 1]:
 # Vymeníme ich, ak sú v nesprávnom poradí
 zoznam[j], zoznam[j + 1] = zoznam[j + 1], zoznam[j]
 return zoznam

def bublinkove_triedenie_optimalizovane(zoznam):
 n = len(zoznam)
 for i in range(n - 1):
 vymenene = False # Príznak, či došlo k výmene v tomto prechode
 for j in range(n - 1 - i):
 if zoznam[j] > zoznam[j + 1]:
 zoznam[j], zoznam[j + 1] = zoznam[j + 1], zoznam[j]
 vymenene = True
 # Ak v tomto prechode nedošlo k žiadnej výmene, zoznam je už triedený
 if not vymenene:
 break
 return zoznam

# Príklad použitia:
moj_zoznam = [5, 1, 4, 2, 8]
vysledok = bublinkove_triedenie(moj_zoznam.copy())
print(f"Netriedený zoznam: {moj_zoznam}")
print(f"Triedený zoznam (základný): {vysledok}")

moj_zoznam_optimalizovany = [5, 1, 4, 2, 8]
vysledok_optimalizovany = bublinkove_triedenie_optimalizovane(moj_zoznam_optimalizovany.copy())
print(f"Triedený zoznam (optimalizovaný): {vysledok_optimalizovany}")

uz_triedeny_zoznam = [1, 2, 3, 4, 5]
vysledok_uz_triedeny = bublinkove_triedenie_optimalizovane(uz_triedeny_zoznam.copy())
print(f"Už triedený zoznam: {uz_triedeny_zoznam}")
print(f"Triedený už triedený zoznam (optimalizovaný): {vysledok_uz_triedeny}")

Časté Chyby a Mylné Predstavy o Bublinkovom Triedení

Pri štúdiu bublinkového triedenia sa študenti často stretávajú s niekoľkými bežnými chybami a mylnými predstavami. Je dôležité si ich uvedomiť, aby ste algoritmu správne porozumeli.

  • Nesprávne pochopenie prechodov: Niekedy sa predpokladá, že po jednom prechode je zoznam už triedený. Je dôležité si uvedomiť, že jeden prechod len zaručuje, že najväčší prvok sa dostane na svoju správnu pozíciu. Na úplné usporiadanie je potrebných (n-1) prechodov.
  • Chybné hranice cyklov: Nesprávne nastavenie hraníc vnútorného alebo vonkajšieho cyklu môže viesť k chybám indexovania (prístup mimo hraníc zoznamu) alebo k neúplnému triedeniu. Vnútorný cyklus by mal ísť len po n - i - 2 (alebo n - i - 1 pre index j + 1), aby sa zabránilo prístupu k už triedeným prvkom a prekročeniu hraníc zoznamu.
  • Vnímanie efektívnosti: Kvôli svojej jednoduchosti sa bublinkové triedenie môže javiť ako efektívny algoritmus. Je však kľúčové pochopiť jeho kvadratickú zložitosť O(n²), ktorá ho robí veľmi neefektívnym pre veľké dátové súbory. Pre n = 1000 prvkov potrebuje približne milión operácií, zatiaľ čo efektívnejšie algoritmy ako Quick Sort alebo Merge Sort (s O(n log n) zložitosťou) by potrebovali rádovo len tisíce operácií.
  • Zabudnutie na optimalizáciu: Hoci optimalizácia s príznakom výmeny nezmení najhoršiu zložitosť, je dôležitá pre pochopenie, ako sa dá zlepšiť výkon v špecifických prípadoch (napr. už triedený zoznam). Jej ignorovanie môže viesť k zbytočným prechodom cez už usporiadaný zoznam.

Čo Sledovať v Simulácii Bublinkového Triedenia

Interaktívna simulácia bublinkového triedenia poskytuje vynikajúcu príležitosť vizualizovať a pochopiť dynamiku tohto algoritmu. Krokovanie porovnaní a výmen pomáha upevniť teoretické vedomosti. Pri práci so simuláciou sa zamerajte na nasledujúce aspekty:

  • Krokovanie porovnaní a výmen: Sledujte, ako sa prvky porovnávajú a kedy dochádza k výmene. Všimnite si, že výmena nastane len vtedy, ak je ľavý prvok väčší ako pravý (pri vzostupnom triedení). Toto vizuálne potvrdzuje, prečo je algoritmus pomalý.
  • Pohyb najväčších prvkov: Počas každého prechodu sledujte, ako sa najväčší prvok z netriedenej časti zoznamu postupne presúva na svoju konečnú pozíciu na konci zoznamu. Tento „bublinkový“ efekt je charakteristický.
  • Skracovanie netriedenej časti: Všimnite si, že po každom prechode sa triedená časť zoznamu na pravej strane rozširuje o jeden prvok a vnútorný cyklus porovnáva o jeden prvok menej. To vizuálne demonštruje optimalizáciu skracovania vnútorného cyklu.
  • Vplyv počiatočného stavu: Experimentujte s rôznymi počiatočnými stavmi zoznamu:
  • Náhodne usporiadaný zoznam: Pozorujte typický priebeh s mnohými výmenami.
  • Zoznam usporiadaný v opačnom poradí: Toto je najhorší prípad. Sledujte maximálny počet výmen a porovnaní.
  • Už usporiadaný zoznam: Ak simulácia implementuje optimalizáciu s príznakom výmeny, všimnite si, že algoritmus vykoná len jeden prechod a potom sa okamžite ukončí, pretože nedošlo k žiadnej výmene (O(n)).
  • Čiastočne usporiadaný zoznam: Pozorujte, ako optimalizácia s príznakom výmeny môže skrátiť počet prechodov.
  • Počet operácií: Ak simulácia zobrazuje počítadlo porovnaní a výmen, sledujte, ako sa tieto čísla menia v závislosti od veľkosti zoznamu a jeho počiatočného usporiadania. To vám pomôže vizuálne potvrdiť teoretickú zložitosť O(n²).

Simulácia je cenným nástrojom na hlbšie pochopenie tohto základného algoritmu a jeho výkonnostných charakteristík v rôznych scenároch.

Často Kladené Otázky (FAQ)

Na čo sa používa bublinkové triedenie v praxi?

V praktických aplikáciách sa bublinkové triedenie používa len zriedka kvôli svojej neefektívnosti pre väčšie dátové súbory. Jeho hlavný význam spočíva v pedagogike, kde slúži ako jednoduchý úvod do základov triediacich algoritmov a analýzy zložitosti.

Prečo sa bublinkové triedenie nazýva „bubble sort“?

Názov "bublinkové triedenie" pochádza z pozorovania, že menšie (alebo väčšie) prvky sa postupne "prebublávajú" na začiatok (alebo koniec) zoznamu, podobne ako vzduchové bublinky stúpajúce na hladinu. V každom prechode sa najväčší netriedený prvok presunie na svoju správnu pozíciu na konci.

Aký je rozdiel medzi najhorším a najlepším prípadom bublinkového triedenia?

Najhorší prípad nastáva, keď je zoznam usporiadaný v opačnom poradí, čo vedie k časovej zložitosti O(n²). Najlepší prípad nastáva, keď je zoznam už usporiadaný, a s použitím optimalizácie s príznakom výmeny dosahuje lineárnu časovú zložitosť O(n), pretože algoritmus dokončí prácu už po jednom prechode.

Je bublinkové triedenie stabilné?

Áno, bublinkové triedenie je stabilný triediaci algoritmus. Stabilita znamená, že ak sú v zozname dva prvky s rovnakou hodnotou, ich relatívne poradie v zozname zostane zachované aj po triedení. To je zabezpečené tým, že výmena nastane iba vtedy, keď je ľavý prvok väčší ako pravý (pri vzostupnom triedení), nie väčší alebo rovný.

Precvič si to, nielen prečítaj

32 kartičiek, test s vysvetlením a podcast k tejto téme. Účet je zadarmo a pokračuješ tam, kde si skončil.

  • Bez platobnej karty
  • Web aj mobilná aplikácia
  • 330 000+ študentov
Začni zadarmo

Súvisiace témy