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:
Omega: n
Theta:
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ů:
3 2 5 1 9 4
První vlna projede celým polem a největší prvek "probublá" na konec.
3 2 5 1 9 4
Začneme tedy s vlnou a porovnáme první 2 prvky (3 a 2):
3 2 5 1 9 4
3 je jistě větší než 2, proto prvky prohodíme
2 3 5 1 9 4
Porovnáme další 2 prvky (3 a 5)
2 3 5 1 9 4
Ty jsou ve správném pořadí, takže je prohazovat nebudeme. Vlna pokračuje dále...
2 3 5 1 9 4
2 3 1 5 9 4
2 3 1 5 9 4
2 3 1 5 4 9
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.
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
Po druhé vlně máme na konci již 2 setříděné prvky. Uděláme další vlnu.
2 1 3 4 5 9
1 2 3 4 5 9
1 2 3 4 5 9
1 2 3 4 5 9
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.
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