Algoritmus je popis postupu, kterým se vyřeší nějaká úloha. Popis postupu přitom nesmí připouštět nejednoznačnost. Při vytváření takového postupu tedy záleží na tom, kdo je adresátem takového postupu. Chcete-li například někomu vysvětlit, jak se řeší soustava rovnic o dvou neznámých, jistě bude záležet na tom, zda ten člověk ví, jak se řeší rovnice o jedné neznámé. To, co bude pro znalce řešení rovnic o jedné neznámé jednoznačným postupem (tj. algoritmem), jak vyřešit rovnici o dvou neznámých, nemusí být pro neznalce vůbec chápáno jako jednoznačné.
Typické tedy je, že algoritmy na sebe navazují. Součástí algoritmu na řešení soustavy dvou rovnic o dvou neznámých je i algoritmus na řešení jedné rovnice s jednou neznámou. V takovém případě není potřeba algoritmus uvádět vždy celý, ale je možné se pouze odkázat na dílčí algoritmus (řešení jedné rovnice), předpokládáme-li, že je dílčí algoritmus znám. To je vlastně jednou z nejdůležitějších myšlenek pro tvorbu algoritmů. Někdy se tomu říká metoda "Rozděl a panuj."
Mluvíme-li o algoritmu, jedná se o popis postupu, který je vždy předáván mezi lidmi. Je-li popis postupu předáván stroji (počítači), nemluvíme už o algoritmu, ale o programu. Každý program tedy realizuje nějaký algoritmus, ovšem více různých programů může realizovat stejný algoritmus. Dalo by se také říci (možná trochu nepřesně, ale výstižně), že algoritmus je popis nějakého programu až na pro člověka nepodstatné detaily.
Protože o algoritmech mluvíme zejména při programování, je cílem maximální determinovanost, tj. v každém kroku algoritmu musí být jasné, jak pokračovat dále. Protože je ale adresátem algoritmu člověk a ne stroj, je možné si při algoritmickém popisu úlohy dovolit i jisté drobné nepřesnosti, lze-li předpokládat, že je člověk domyslí. Ovšem naopak, pokud panuje jakákoliv nejistota ohledně možnosti člověka algoritmus domyslet, je potřeba postup natolik zpřesnit, aby byl zcela jasný.
Algoritmy lze vyjadřovat různými cestami. Konkrétní způsob se volí podle přehlednosti toho či onoho případu. Cílem je vždy maximální přehlednost. Vyjadřovat algoritmy lze například:
Při vyjadřování algoritmu je vždy potřeba dbát na to, aby bylo vždy jasné, jak daný algoritmus převést na program.
Na příkladu řešení soustavy dvou rovnic o dvou neznámých si můžeme ukázat příklad zápisu takového algoritmu. A využijeme přitom možnost zapsat algoritmus slovním popisem:
y a x chápej jenom jako konstantu. Tj. převeď metodou řešení rovnice o jedné neznámé rovnici na tvar y = výraz(x).y v druhé rovnici nahraď výrazem, který vyšel v první rovnici, tedy tím, co je zde uvedeno jako výraz(x). Tím se z druhé rovnice stala rovnice s jedinou neznámou x.x si zapamatuj.x dosaď do výrazu výraz(x), který byl stanoven v kroku 1. Výsledek si zapamatuj jako hodnotu neznámé y.x a y jako zapamatované hodnoty z kroků 3 a 4.Je nutné poznamenat, že tento algoritmus není úplný. Neřeší speciální situace. Kdybychom chtěli mít tento algoritmus dokonalejší, museli bychom ošetřit i speciální případy, které v matematice vyjadřujeme jako, že "soustava má nekonečně mnoho řešení" popřípadě "soustava nemá žádné řešení". V obou těchto případech by výše popsaný algoritmus selhal buď v kroku 1 nebo v kroku 3, neboť příslušná rovnice by pak nebyla řešitelná.
Může existovat více algoritmů, které řeší stejnou úlohu. Například výše uvedený algoritmus na řešení soustavy dvou rovnic odpovídá takzvané dosazovací metodě. Jak známo, soustavu rovnic lze řešit i úplně rozdílnou sčítací metodou. Té by odpovídal úplně jiný algoritmus. Různé algoritmy prostě mohou vést ke stejnému výsledku.
Máme-li tedy nějakou konkrétní úlohu (například řešení soustavy dvou rovnic), můžeme mít vícero algoritmů, které danou úlohu řeší (v našem případě napří dosazovací metoda nebo sčítací metoda). Algoritmy pak můžeme mezi sebou porovnávat podle různých kritérií:
x = 5, y = 7, může algoritmus přesto vypsat výsledek třeba x = 8, y = 5. Takový algoritmus je potom potřeba chápat jako algoritmus nekorektní (nedělá to, co od něj očekáváme) a tudíž je i zcela nezajímavý a zbytečný. Takový algoritmus nikdo nechce. Je tedy povinností předkladatele libovolného algoritmu dokázat, že tento algoritmus opravdu korektně řeší danou úlohu. Korektnost algoritmu je nezbytnou podmínkou jeho použití.10 ms místo 0.1 ms, asi to nikoho trápit nebude.Každý algoritmus má nějaký vstup a nějaký výstup. Například náš algoritmus na řešení soustavy dvou rovnic o dvou neznámých očekává na vstupu dvě rovnice se dvěma neznámými a jeho výstupem jsou číselné hodnoty pro neznámou x a y.
Mluvíme-li tedy o úloze, rozumíme tím popis vstupu a výstupu algoritmu, ale také jejich vzájemné vztahy. Úloha tedy určuje co chceme získat, algoritmus určuje jak to chceme získat.
Pod pojmem algoritmizace rozumíme úvahy nad konkrétními úlohami na úrovni algoritmů. V algoritmizaci jde tedy o to najít algoritmus co nejlepších vlastností pro danou úlohu.
Implementací algoritmu rozumíme jeho realizaci v konkrétním programovacím jazyce, aby jej mohl pochopit i počítač. Protože počítač při provádění kódu nepřipouští žádnou nejednoznačnost, je vlastně implementace tím posledním krokem, který odstraní všechny zbylé nejednoznačnosti.
Je přitom potřeba dbát na to, aby při implementaci nedocházelo k chybám. Vlivem nejednoznačností, nebo prostě nepochopení může dojít k tomu, že algoritmus byl implementován chybně, což vede k následné nekorkektnosti, popřípadě i nekonečnosti konkrétní implementace. Je potřeba si uvědomit, že chybování při implementaci je běžný stav, který se týká i těch nejzkušenějších programátorů. Je proto potřeba spíše se věnovat způsobům, jak chyby efektivně odstraňovat, než se chybám vyhýbat, nebo je dokonce popírat. Jestliže někdo tvrdí, že nikdy neudělal při porgramování chybu, znamená to, že nikdy nic nenaprogramoval. Známá programátorská poučka totiž tvrdí, že každý program má aspoň jednu chybu.