Insertion sort – triedenie vkladaním v Java

Triediace algoritmy sa používajú na vzostupné alebo zostupné preusporiadanie prvkov poľa alebo zoznamu podľa numerického alebo lexikografického poradia. Triedenie je veľmi dôležité pre optimálny výkon iných algoritmov, ktoré vyžadujú triedené vstupné dáta.

Insertion sort algoritmus Java príklad
Insertion sort algoritmus Java príklad

V článku sa dozvieš:

    Existuje množstvo rozličných triediacich algoritmov. Výber vhodného algoritmu závisí na faktoroch ako veľkosť a vlastnosti vstupných dát, dostupná pamäť a požiadavky na časovú a priestorovú náročnosť.

    Aby sme ti uľahčili výber, predstavíme si v našom seriáli postupne najznámejšie algoritmy triedenia dát, vysvetlíme si ich princípy, výhody a nevýhody a naprogramujeme si ich v Jave.

    Doteraz sme sa venovali nasledujúcim triediacim algoritmom:

    Dnes sa budeme venovať triedeniu vkladaním (angl. insertion sort).

    Insertion sort

    Insertion Sort je jednoduchý a intuitívny algoritmus na triedenie poľa alebo zoznamu prvkov. Funguje podobne ako metóda, ktorou si ľudia triedia hracie karty na ruke. Svoje obdržané karty si udržiavajú zotriedené a každú novú kartu, ktorú dostanú si vložia na miesto, aby zachovávala svoje relatívne poradie.

    Insertion sort vs selection, quick, merge sort

    Insertion Sort sa často používa ako súčasť komplexnejších triediacich algoritmov (napríklad pri malých podmnožinách v Quick Sorte alebo Merge Sorte), pretože jeho výkon je pre malé množiny údajov dobrý. V porovnaní so Selection Sort, ktorý sme rozoberali minule, ponúka stabilný algoritmus.

    Insertion sort algoritmus – princíp fungovania

    Algoritmus začína rozdelením vstupného vektora na zotriedenú a nezotriedenú časť. Prvý prvok poľa sa automaticky považuje za zotriedený a zvyšné prvky sa ešte musia zotriediť. Pre každý prvok v netriedenej časti (od druhého po posledný prvok poľa) sa tento prvok vyberie a vloží na správne miesto v triedenej časti poľa tak, aby bola triedená časť stále usporiadaná. Tento krok zahŕňa porovnávanie vybraného prvku s ostatnými prvkami v zotriedenej časti a popresúvanie prvkov, aby sa uvoľnilo miesto pre vybraný prvok. Presúvaniu sa dá vyhnúť, ak si zvolíme dátový typ zoznam miesto poľa.

    Praktický príklad si potom ukážeme v Java kóde.

    Výhody algoritmu Insertion sort

    • Ľahký na pochopenie aj implementáciu,
    • efektívny pre malé množiny údajov alebo takmer usporiadané poľa,
    • vhodný pre prichádzajúce prvky, ktoré musia byť priebežne triedené,
    • nevyžaduje dodatočnú pamäť pri triedení,
    • stabilný.

    Nevýhoda algoritmu Insertion sort

    • Časová náročnosť je však stále O(n²), čo z neho robí pomalý algoritmus pre veľkú sadu dát.

    Insertion sort časová náročnosť

    Algoritmus Metóda Časová náročnosť Pamäť Stabilný
    najhoršia priemer najlepšia
    Insertion sort vkladanie O(n²) O(n²) n O(1) áno

    Insertion sort animácie, vizualizácia, gif

    Vizualizácia Insertion sort vyzerá nasledovne:

    Vizualizácia Insertion sort
    Swfung8, CC BY-SA 4.0, via Wikimedia Commons
    insertion sort visualizácia
    Simpsons contributor, CC BY-SA 4.0, via Wikimedia Commons

    Zdroj: commons.wikimedia.org/wiki/Category:Animations_of_sort_algorithms

    Animáciu algoritmu nájdeš napríklad na stránke Toptal. Nachádza sa tam 8 typov algoritmov, animáciu si môžeš pustiť aj pozadu.

    Na tejto stránke si môžeš prejsť jednotlivými krokmi algoritmu, vďaka čomu si vieš overiť časovú náročnosť algoritmu.

    Insertion sort implementácia, Java kód

    Teraz si ukážeme jednoduchú implementáciu algoritmu Insertion sort v Jave.

    InsertionSort.java

    package sorting;
    
    public class InsertionSort {
        private int key, j;
    
        public void sort(int data[])
        {
            // Start with 2nd element, as 1st is considered to be sorted
            for (int i = 1; i < data.length - 1; i++) {
                System.out.println(i + ". iteration (key = " + data[i] + ")");
                // Element that needs to be inserted into sorted part
                key = data[i];
                j = i - 1;
                // Move all elements > key one position to the right
                while (j >= 0 && key < data[j]) {
                    data[j + 1] = data[j];
                    j--;
                }
                // Insert the key in its correct spot
                data[j + 1] = key;
                printArray(data);
            }
        }
    
        // Function to print an array
        public void printArray(int data[])
        {
            for (int i = 0; i < data.length; i++)
                System.out.print(data[i] + " ");
            System.out.println();
        }
    }

     

    Main.java

    import sorting.InsertionSort;
    
    public class Main {
        public static void main(String[] args) {
            int dataToSort[] = { 6, 5, 4, 2, 3, 1, 7 };
            InsertionSort insertionSort = new InsertionSort();
            System.out.print("Input: ");
            insertionSort.printArray(dataToSort);
            insertionSort.sort(dataToSort);
            System.out.print("Sorted: ");
            insertionSort.printArray(dataToSort);
        }
    }

    Výstup z tohto príkladu je:

    Výstup z tohto príkladu je:

    Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si Java Insertion Sort kód.

    Ak si Java programátor a hľadáš prácu, pozri si naše benefity pre zamestnancov a reaguj na najnovšie ponuky práce.

    O autorovi

    Jozef Wagner

    Java Developer Senior

    Viac ako 10 rokov programujem v Jave, momentálne pracujem v msg life Slovakia ako Java programátor senior a pomáham zákazníkom implementovať ich požiadavky do poistného softvéru Life Factory. Vo voľnom čase si rád oddýchnem v lese, prípadne si zahrám nejakú dobrú počítačovú hru.

    Daj nám o sebe vedieť