Algorithm (from the name of Persian mathematician Muhammad ibn Musa alKhwarizmi) is an exact stepbystep description of how to solve some type of a problem. Algorithms are basically what programming is all about: we tell computers, in very exact ways (with programming languages), how to solve problems  we write algorithms. But algorithms don't have to be just computer programs, they are simply exact instruction for solving problems. Although maybe not as obvious, mathematics is also a lot about creating algorithms because it strives to give us exact instructions for solving problems  a mathematical formula usually tells us what we have to do to compute something, so in a way it is an algorithm too.
Cooking recipes are commonly given as an example of a noncomputer algorithm, though they rarely contain branching ("if condition holds then do...") and loops ("while a condition holds do ..."), the key features of algorithms. The so called wallfollower is a simple algorithm to get out of any maze which doesn't have any disconnected walls: you just pick either a lefthand or righthand wall and then keep following it. Long division of numbers which students are taught at school is also an algorithm. You may write a crazy algorithm basically for any kind of problem, e.g. for how to clean a room or how to get a girl to bed, but it has to be precise so that anyone can execute the algorithm just by blindly following the steps; if there is any ambiguity, it is not considered an algorithm; a vague, imprecise "hint" on how to find a solution (e.g. "the airport is somewhere in this general direction.") we rather call a heuristic. Heuristics are useful too and they may be utilized by an algorithm, e.g. to find a precise solution faster, but from programmer's point of view algorithms, the PRECISE ways of finding solutions, are the basics of everything.
Interesting fact: contrary to intuition there are problems that are mathematically proven to be unsolvable by any algorithm, see undecidability, but for most practically encountered problems we can write an algorithm (though for some problems even our best algorithms can be unusably slow).
Algorithms are mostly (possibly not always, depending on exact definition of the term) written as a series of steps (or "instructions"); these steps may be specific actions (such as adding two numbers or drawing a pixel to the screen) or conditional jumps to other steps ("if condition X holds then jump to step N, otherwise continue"). At the lowest level (machine code, assembly) computers cannot do anything more complex than that: execute simple instructions (expressed as 1s and 0s) and perform conditional jumps  in this computers are quite dumb (their strength comes from being able to execute many instruction with extreme speed). These jumps can be used to create branches (in programming known as ifthenelse) and loops. Branches and loops are together known as control structures  they don't express a direct action but control which steps in the algorithm will follow. All in all, any algorithm can be built just using these three basic constructs:
Note: in a wider sense algorithms may be expressed in other (mathematically equivalent) ways than sequences of steps (nonimperative ways, see declarative languages), even mathematical equations are often called algorithms because they imply the steps towards solving a problem. But we'll stick to the common narrow meaning of algorithm given above.
Additional constructs can be introduced to make programming more comfortable, e.g. subroutines/functions (kind of small subprograms that the main program uses for solving the problem), macros (shorthand commands that represent multiple commands) or switch statements (selection but with more than two branches). Loops are also commonly divided into several types such as: counted loops, loops with condition and the beginning, loops with condition at the end and infinite loops (for
, while
, do while
and while (1)
in C, respectively)  in theory there can only be one generic type of loop but for convenience programming languages normally offer different "templates" for commonly used loops. Similarly to mathematical equations, algorithms make use of variables, i.e. values which can change and which have a specific name (such as x or myVariable).
Practical programming is based on expressing algorithms via text, but visual programming is also possible: flowcharts are a way of visually expressing algorithms, you have probably seen some. Decision trees are special cases of algorithms that have no loops, you have probably seen some too. Even though some languages (mostly educational such as Snap) are visual and similar to flow charts, it is not practical to create big algorithms in this way  serious programs are written as a text in programming languages.
Let's write a simple algorithm that counts the number of divisors of given number x and checks if the number is prime along the way. (Note that we'll do it in a naive, educational way  it can be done better). Let's start by writing the steps in plain English (sometimes called pseudocode):
Notice that x, divisor counter and currently checked number are variables. Step 4 is a loop (iteration) and steps a and 6 are branches (selection). The flowchart of this algorithm is:
START

V
read x

V
set divisor count to 0

V
set checked number to 1

.>
 
 V no
 checked number <= x ? .
  
  yes 
 V 
 checked number no 
 divides x ? . 
   
  yes  
 V  
 increase divisor  
 count by 1  
   
   
 <' 
  
 V 
 increase checked V
 number by 1 print divisor count
  
'' 
V no
divisor count = 2 ? .
 
 yes 
V 
print "number is prime" 
 
<'
V
END
This algorithm would be written in Python as:
x = int(input("enter a number: "))
divisors = 0
for i in range(1,x + 1):
if x % i == 0: # i divides x?
divisors = divisors + 1
print("divisors: " + str(divisors))
if divisors == 2:
print("It is a prime!")
in JavaScript as:
function main()
{
let x = parseInt(prompt("enter a number:"));
let divisorCount = 0;
for (let i = 1; i <= x; ++i)
if (x % i == 0) // i divides x?
divisorCount++;
console.log("divisors: " + divisorCount);
if (divisorCount == 2)
console.log("It is a prime!");
}
in C as:
#include <stdio.h>
int main(void)
{
int x, divisors = 0;
printf("enter a number: ");
scanf("%d",&x); // read a number
for (int i = 1; i <= x; ++i)
if (x % i == 0) // i divides x?
divisors = divisors + 1;
printf("number of divisors: %d\n",divisors);
if (divisors == 2)
puts("It is a prime!");
return 0;
}
in Forth as:
variable x
variable divisorCount
: main
." enter a number: "
0 \ number to read
begin \ read the number by digits
key
dup dup 48 >= swap 57 <= and
while
48  swap 10 * +
repeat
drop
dup . cr
x !
0 divisorCount !
x @ 1+ 1 do
x @ i mod 0 = if \ i divides x?
1 divisorCount +!
then
loop
." number of divisors: " divisorCount @ . cr
divisorCount @ 2 = if
." It is a prime!" cr
then
;
main
bye
in comun as:
0
@@ # read X and convert to number
<
$0 $0 "0" < >< "9" >  ? !@ .
"0"  >< 10 * +
.
^
0 # divisor count
1 # checked number
@@
$0 $3 > ? # checked num. > x ?
!@
.
$2 $1 % 0 = ? # checked num. divides x ?
$1 ++ $:2 # increase divisor count
.
++ # increase checked number
.
0 "divisors: " > # write divisor count
$1 10 >= ?
$1 10 / "0" + >
.
$1 10 % "0" + > 10 >
$1 2 = ?
0 "It is a prime" > 10 >
.
in Scheme Lisp as (here notice the difference in paradigm  loop is replaced with recursion, as it's done in functional programming):
(define (countDivisors x countFrom currentCount) ; recursive function
(if (> countFrom x)
(begin
(display "divisor count: ")
(display currentCount)
(newline)
(if (= currentCount 2)
(display "It is a prime!\n")))
(countDivisors x (1+ countFrom)
(+ currentCount (if (zero? (remainder x countFrom)) 1 0)))))
(display "enter a number: ")
(countDivisors (read) 1 0)
and also for fun in Brainfuck (a bit simplified version, made with our Macrofucker language):
[]>[]++++++++++++++++++++++++++++++++++++++++++++++++>,>[]>[]<<<[>>+>+<<<]
>>>[<<<+>>>]<[<>]<>[]<[>+<]<[>+<]>>[<<+>>]<[]++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>[]>
[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]<<[>>>
[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<+>]<<<]>>[<<<+>>>]<<<>[]+++++++++++++++
+++++++++++++++++++++++++++++++++>,>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>
[]<[>+<]<[>+<]>>[<<+>>]<[]++++++++++>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[
]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]<<[>>>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>
]<[<+>]<<<]>>[<<<+>>>]<<<>[]<[>+<]<[>+<]>>[<<+>>]<<>[]>[]<<<[>>+>+<<<]
>>>[<<<+>>>]<[<+>]<>[]++++++++++++++++++++++++++++++++++++++++++++++++>,>[]
>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>[]<[>+<]<[>+<]>>[<<+>>]<<>[]>[]<<
<[>>+>+<<<]>>>[<<<+>>>]<[<+>]<>[]<[>+<]<<<[>>>+<<<]>>>>[<<<<+>>>>]<<<<>[
]>[]<<[>+>+<<]>>[<<+>>]<[>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]>[]<<<[>
>+>+<<<]>>>[<<<+>>>]<>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<<<[]>>>[]>[]>[]<<
<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<+<[>
>[]>[]<<[>+>+<<]>>[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<<]<>[]+<[[
]><]>[<+>[]]<[<<<+>>>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>[]>[]>[]<
<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<+<[
>>[]>[]<<[>+>+<<]>>[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<<]<>[]+<[
[]><]>[<+>[]]<]<>[]<[>+<]<[>+<]>>[<<+>>]<<>[]+<[[]><]>[<+>[]]<[<<<<+
>>>>[]]<<]<<>[]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]
>[]<<<[>>+>+<<<]>>>[<<<+>>>]<>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<<<[]>>>[]
>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>
>>>]<+<[>>[]>[]<<[>+>+<<]>>[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<<
]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>[
]>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+
>>>>]<+<[>>[]>[]<<[>+>+<<]>>[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<
<]<>[]+<[[]><]>[<+>[]]<]<>[]<[>+<]<[>+<]>>[<<+>>]<<>[]<[>+<]<[>+<]>>
[<<+>>]<>[]++++++++++++++++++++++++++++++++++++++++++++++++>[]>[]<<<[>>+>+
<<<]>>>[<<<+>>>]<[<+>]<.<<<[]++++++++++>>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<
>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<<<[]>>>[]>[]>[]<<<<[>>>+>+<<<<]>>>>[<
<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<+<[>>[]>[]<<[>+>+<<]>>
[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<<]<>[]+<[[]><]>[<+>[]]<[<<<+>
>>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>[]>[]>[]<<<<[>>>+>+<<<<]>>>>[
<<<<+>>>>]<>[]>[]<<<<[>>>+>+<<<<]>>>>[<<<<+>>>>]<+<[>>[]>[]<<[>+>+<<]>
>[<<+>>]<>[]+<[[]><]>[<+>[]]<[<<<+>>>[]]<<]<>[]+<[[]><]>[<+>[]]<]<>[
]<[>+<]<[>+<]>>[<<+>>]<<>[]<[>+<]<[>+<]>>[<<+>>]<>[]+++++++++++++++++++
+++++++++++++++++++++++++++++>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<+>]<.<>[]<
[>+<]<[>+<]>>[<<+>>]<>[]++++++++++++++++++++++++++++++++++++++++++++++++>[
]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<+>]<.<<<<>[]++++++++++.[]++>[]>[]<<<[>
>+>+<<<]>>>[<<<+>>>]<>[]>[]<<<[>>+>+<<<]>>>[<<<+>>>]<[<>]<>[]+<[[]><]
>[<+>[]]<[[]+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++.[]++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++.[]++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++.[]++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.[]++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++.[]++++++++++.[]]
TODO: assembly, haskell, unix shell, ...
This algorithm is however not very efficient and could be optimized  for example not only we wouldn't have to check if a number is divisible by 1 and itself (as every number is), but there is also no need to check divisors higher than the square root of the checked value (mathematically above square root there only remain divisors that are paired with the ones already found below the square root) so we could lower the number of the loop iterations and so make the algorithm finish faster. You may try to improve the algorithm this way as an exercise :)
Algorithms are the core topic of computer science, there's a lot of theory and knowledge about them.
Turing machine, a kind of mathematical bareminimum computer, created by Alan Turing, is the traditional formal tool for studying algorithms, though many other models of computation exist  for example lambda calculus that's a basis of functional programming under which we already see algorithms in a bit different light: not as a series of steps but rather as evaluating mathematical functions. From theoretical computer science we know not all problems are computable, i.e. there are problems unsolvable by any algorithm (e.g. the halting problem). Computational complexity is a theoretical study of resource consumption by algorithms, i.e. how fast and memory efficient algorithms are (see e.g. P vs NP). Mathematical programming is concerned, besides others, with optimizing algorithms so that their time and/or space complexity is as low as possible which gives rise to algorithm design methods such as dynamic programming (practical optimization is a more pragmatic approach to making algorithms more efficient). Formal verification is a field that tries to mathematically (and sometimes automatically) prove correctness of algorithms (this is needed for critical software, e.g. in planes or medicine). Genetic programming and some other methods of artificial intelligence try to automatically create algorithms (algorithms that create algorithms). Quantum computing is concerned with creating new kinds of algorithms for quantum computers (a new type of stillinresearch computers). Programming language design is the art and science of creating languages that express computer algorithms well. Etcetc.
Following are some well known algorithms.
Powered by nothing. All content available under CC0 1.0 (public domain). Send comments and corrections to drummyfish at disroot dot org.