
Algorytm – skończony ciąg jasno zdefiniowanych czynności koniecznych do wykonania pewnego rodzaju zadań, sposób postępowania prowadzący do rozwiązania problemu. W informatyce algorytmem nazywa się dobrze określoną procedurę obliczeniową, która przyjmuje dane wejściowe i produkuje dane wyjściowe, czyli obliczalny zbiór kroków prowadzących do pożądanego rezultatu.
Słowo „algorytm” pochodzi od łacińskiego algorithmus (lub algorismus), oznaczającego wykonywanie działań za pomocą liczb arabskich, w odróżnieniu od abacism, czyli rachowania z użyciem abakusa. Wyraz ten wywodzi się od „Algoritmi”, zlatynizowanej wersji nazwiska al-Chuwarizmiego, matematyka działającego w IX wieku.
Definicja zakłada skończoność i jednoznaczność. Algorytm wykonuje skończoną liczbę kroków i dla danych wejściowych wyznacza dane wyjściowe. W przypadku algorytmów randomizowanych (losowych) przebieg obliczeń może zależeć nie tylko od danych wejściowych, lecz także od wartości losowych generowanych podczas działania algorytmu. Algorytmy te można opisywać za pomocą prawdopodobieństw uzyskania określonych wyników lub czasu wykonania.
Poniższa procedura wyznacza największą liczbę na niepustej, skończonej liście liczb. Niech indeks wskazuje aktualnie badany element listy, a maksimum oznacza największą dotychczas znalezioną wartość.
Po wykonaniu procedury maksimum zawiera największą liczbę z listy. Procedura działa dla list o dowolnej długości, ponieważ korzysta wyłącznie z przejścia do kolejnego elementu.
Do znanych algorytmów należą m.in. algorytm Euklidesa, algorytm Dijkstry, algorytm Luhna, algorytm mrówkowy, algorytm Fermata, algorytmy kompresji i kryptograficzne, algorytmy sortowania, w tym sortowanie przez scalanie, algorytmy przeszukiwania drzew gier: min-max i alfa-beta oraz algorytm unifikacji.

Algorytmy opisuje się w języku naturalnym, w postaci schematów blokowych oraz w pseudokodzie.

Ten sam algorytm można wyrazić na różne sposoby, na różnych poziomach abstrakcji. Poniższe fragmenty programów realizują ten sam algorytm sumowania trójek.
Zapis w języku C:
wynik = 3;
wynik += 3;
wynik += 3;
Ten sam język, z zastosowaniem pętli:
wynik = 0;
for (int i = 0; i < 3; ++i) wynik += 3;
Zapis w asemblerze x86:
mov eax, 0
add eax, 3
add eax, 3
add eax, 3
Jednym z matematycznych modeli obliczeń jest maszyna Turinga, składająca się z głowicy czytająco-piszącej poruszającej się po podzielonej na komórki taśmie. W każdym kroku maszyna odczytuje symbol z komórki wskazywanej przez głowicę, a następnie, zgodnie z funkcją przejścia, może zapisać symbol, przesunąć głowicę i zmienić swój stan.
Podstawowe paradygmaty projektowania algorytmów komputerowych zestawia poniższa tabela.
| Paradygmat | Idea |
|---|---|
| dziel i zwyciężaj | problem dzieli się na mniejsze podproblemy, rozwiązywane rekurencyjnie, a następnie łączy się ich wyniki |
| programowanie dynamiczne | rozwiązania podproblemów zapamiętuje się i wykorzystuje ponownie przy rozwiązywaniu głównego problemu |
| metoda zachłanna | w każdym kroku wybierane jest lokalnie najlepsze rozwiązanie |
| algorytm z nawrotami | systematyczne wypróbowywanie możliwych rozwiązań z cofaniem się, gdy wybrana droga okazuje się błędna |
Algorytmy klasyfikuje się także według wielu innych, niezależnych kryteriów: według użycia losowości (deterministyczne i randomizowane), trybu wykonania (sekwencyjne i równoległe), podstawy obliczeń (klasyczne i kwantowe) oraz rodzaju wyniku (dokładne i przybliżone).
Efektywność algorytmu ocenia się według czasu obliczeń w zależności od rozmiaru danych wejściowych, mierzona zgodnie z złożonością obliczeniową. Algorytmy działające w czasie wielomianowym uznaje się w teorii złożoności za efektywne. Jest to jednak kryterium asymptotyczne, które nie uwzględnia stałych współczynników ani stopnia wielomianu. W praktyce zależność ta bywa odwrócona: algorytm simpleks, nie działający w czasie wielomianowym w najgorszym przypadku, jest uznawany za efektywny i szeroko stosowany.
Klasa NP obejmuje problemy decyzyjne, których poprawne rozwiązanie da się zweryfikować w czasie wielomianowym. Problem decyzyjny nazywa się problemem NP-zupełnym, jeżeli należy do klasy NP i jest NP-trudny, czyli każdy problem z klasy NP można do niego zredukować w czasie wielomianowym. Do problemów NP-trudnych należy m.in. problem komiwojażera. Pytanie, czy P=NP, czyli czy istnieją wielomianowe algorytmy rozwiązywania problemów NP-zupełnych, należy do problemów milenijnych. Istnieją również problemy obliczeniowo nierozstrzygalne — Turing wykazał w pracy On Computable Numbers nierozstrzygalność problemu decyzyjnego (Entscheidungsproblem).
Wykorzystanie kart graficznych do obliczeń ogólnego przeznaczenia stało się istotnym nurtem obliczeń równoległych. Do obliczeń rozproszonych z udziałem ochotników służy otwarta platforma BOINC. W ramach tej platformy realizowano m.in. projekt SETI@home, w którym ochotnicze komputery analizowały dane obserwacji kosmicznych.
Algorytm nie musi być wykonywany przez komputer. Może go wykonać człowiek, jak procedura z przykładu powyżej. Może też zostać zrealizowany przez urządzenie mechaniczne. Obliczenia realizuje się również w procesach molekularnych. W 1994 roku L. Adleman zademonstrował wykonanie obliczeń za pomocą cząsteczek DNA, rozwiązując instancję skierowanego problemu ścieżki Hamiltona.
Algorytmy genetyczne, oparte na doborze naturalnym i dziedziczności, służą do poszukiwania dobrych rozwiązań problemów optymalizacyjnych. Jakość rozwiązań ocenia się za pomocą funkcji przystosowania. Populacje rozwiązań są powielane (selekcja), krzyżowane i modyfikowane przez mutacje, a najlepiej przystosowane jednostki mają największe szanse przejścia do kolejnej generacji.

Niektóre kryptosystemy, takie jak RSA, opierają się na trudności rozkładu liczby na czynniki pierwsze oraz obliczania logarytmów dyskretnych. Oba problemy uważane są za trudne dla komputerów klasycznych. Algorytm Shora rozwiązuje faktoryzację w czasie wielomianowym za pomocą komputera kwantowego. Komputery kwantowe wykorzystują kubity, superpozycję i interferencję kwantową.

Algorytmy są znacznie starsze niż komputery. Najstarsze znane algorytmy zapisano na glinianych tabliczkach w matematyce babilońskiej ponad 4000 lat temu. W starożytnej Grecji opisano algorytm Euklidesa wyznaczania największego wspólnego dzielnika dwóch liczb oraz sito Eratostenesa. Al-Chuwarizmi, od którego nazwiska pochodzi nazwa pojęcia, nie był twórcą samej idei algorytmu.
W połowie lat 30. XIX wieku Charles Babbage opracował plany maszyny analitycznej, uważanej za prekursora nowoczesnych komputerów cyfrowych. Maszyny nigdy nie zbudowano, a Ada Lovelace, opisując w notach jej działanie, jest uznawana za pierwszą programistkę.
Pod koniec XIX wieku karty perforowane umożliwiły elektromechanicznym maszynom przetwarzanie dużych zbiorów danych. System Hermana Holleritha, oparty na elektrycznym odczytywaniu i sortowaniu kart perforowanych, posłużył do zliczania danych spisu ludności Stanów Zjednoczonych z 1890 roku, a firma Holleritha była jednym z zalążków IBM.
W 1937 roku Alan Turing opublikował w „Proceedings of the London Mathematical Society” pracę On Computable Numbers, w której opisał matematyczny model obliczeń, dziś znany jako maszyna Turinga. Konrad Zuse ukończył w 1941 roku Z3, uznawany za pierwszy działający, swobodnie programowalny komputer, oparty na systemie binarnym.
W Stanach Zjednoczonych prace nad ENIAC rozpoczęto w 1943 roku, a maszynę ukończono w 1946 roku.

W Stanach Zjednoczonych sam algorytm, jako abstrakcyjna idea, nie podlega ochronie patentowej. W sprawie Alice Corp. v. CLS Bank International (2014) Sąd Najwyższy Stanów Zjednoczonych orzekł, że samo zrealizowanie abstrakcyjnej idei za pomocą komputera nie czyni wynalazku kwalifikowalnym do objęcia patentem.
W Europie art. 52 Europejskiej Konwencji Patentowej wyłącza spod patentowania m.in. odkrycia naukowe, metody matematyczne i programy komputerowe w zakresie, w jakim dotyczą ich „jako takich”. Zgodnie z wytycznymi EPO wyłączenie nie dotyczy programów komputerowych o charakterze technicznym — program komputerowy musi w trakcie wykonywania wywoływać dalszy skutek techniczny.
Zgodnie z unijną dyrektywą 2009/24/WE programy komputerowe podlegają ochronie prawnoautorskiej jako utwory literackie.