Programování
Bubble sort
Bubble sort je poměrně hloupý algoritmus, který se vyskytuje v podstatě
jen v akademickém světě. Nemá žádné dobré vlastnosti a je zajímavý
pouze svým průběhem, který může připomínat fyzikální nebo přírodní
jevy. Algoritmus probíhá ve vlnách, přičemž při každé vlně
propadne "nejtěžší" prvek na konec (nebo nejlehčí vybublá
nahoru, záleží na implementaci). Vlna porovnává dvojice sousedních prvků
a v případě, že je levý prvek větší než pravý, prvky prohodí.
Algoritmus je stabilní.
Stabilní
Na místě
O (n²)
Velmi špatná rychlost
Omicron: n²
Omega: n
Theta: n²
Průběh
Protože Bubble sort je poněkud neoptimalizovaný algoritmus, bude průběh
o něco delší, než bylo doposud zvykem.
Mějme pole následujících prvků:
První vlna projede celým polem a největší prvek "probublá" na
konec.
Začneme tedy s vlnou a porovnáme první 2 prvky (3 a 2):
3 je jistě větší než 2, proto prvky prohodíme
Porovnáme další 2 prvky (3 a 5)
Ty jsou ve správném pořadí, takže je prohazovat nebudeme. Vlna
pokračuje dále...
Po první vlně se maximum (9) opravdu probublalo na konec. Poslední prvek
je tedy zatříděný a my si ho už nebudeme všímat. Další vlna bude o 1
prvek kratší, než předchozí, a vynese na konec maximum z nesetříděné
části pole.
Po druhé vlně máme na konci již 2 setříděné prvky. Uděláme další
vlnu.
Vidíme, že pole je nyní setříděné. Program by udělal ještě jednu
vlnu a když by zjistil, že se nic neprohodilo, vrátil by výsledek.
3 | 2 | 5 | 1 | 9 | 4 |
3 | 2 | 5 | 1 | 9 | 4 |
3 | 2 | 5 | 1 | 9 | 4 |
2 | 3 | 5 | 1 | 9 | 4 |
2 | 3 | 5 | 1 | 9 | 4 |
2 | 3 | 5 | 1 | 9 | 4 |
2 | 3 | 1 | 5 | 9 | 4 |
2 | 3 | 1 | 5 | 9 | 4 |
2 | 3 | 1 | 5 | 4 | 9 |
2 | 3 | 1 | 5 | 4 | 9 |
2 | 3 | 1 | 5 | 4 | 9 |
2 | 1 | 3 | 5 | 4 | 9 |
2 | 1 | 3 | 5 | 4 | 9 |
2 | 1 | 3 | 4 | 5 | 9 |
2 | 1 | 3 | 4 | 5 | 9 |
1 | 2 | 3 | 4 | 5 | 9 |
1 | 2 | 3 | 4 | 5 | 9 |
1 | 2 | 3 | 4 | 5 | 9 |
Kod
public static void BubbleSort(int[] data)
{
for (int j = 0; j < data.Length; j++)
{
bool change = false;
for (int i = 0; i < data.Length - 1 - j; i++)
{
if (data[i] > data[i + 1])
{
Swap(i, i + 1, data);
change = true;
}
}
if (!change)
break;
}
}
public static void Swap(int a, int b, int[] data)
{
int tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
Video
Zdroj: Video Link