
Java programátor expert
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.
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 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 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.
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.
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 |
Vizualizácia Insertion sort vyzerá nasledovne:
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.
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:
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.