Vou dar a mesma resposta que dei no momento anterior em que essa pergunta surgiu.
Primeiro, entenda que não há uma boa definição formal de "algoritmo" no momento da redação. A palavra-chave aqui é "formal".
No entanto, há pessoas inteligentes trabalhando nisso.
O que sabemos é que, qualquer que seja um "algoritmo", ele fica em algum lugar entre "função matemática" e "programa de computador".
Uma função matemática é uma noção formal de um mapeamento de entradas para saídas. Assim, por exemplo, "classificar" é um mapeamento entre uma sequência de itens que podem ser solicitados e uma sequência de itens que podem ser solicitados do mesmo tipo, que mapeia cada sequência para sua sequência ordenada. Esta função pode ser implementada usando algoritmos diferentes (por exemplo, classificação de mesclagem, classificação de heap). Cada algoritmo, por sua vez, pode ser implementado usando programas diferentes (mesmo com a mesma linguagem de programação).
Portanto, o melhor controle que temos sobre o que é um "algoritmo" é que é algum tipo de classe de equivalência em programas, onde dois programas são equivalentes se fizerem "essencialmente a mesma coisa". Quaisquer dois programas que implementam o mesmo algoritmo devem calcular a mesma função, mas o inverso não é verdadeiro.
Da mesma forma, há uma classe de equivalência entre algoritmos, em que dois algoritmos são equivalentes se eles computarem a mesma função matemática.
A parte difícil de tudo isso é tentar capturar o que queremos dizer com "essencialmente a mesma coisa".
Existem algumas coisas óbvias que devemos incluir. Por exemplo, dois programas são essencialmente os mesmos se diferirem apenas por renomeações de variáveis. A maioria dos modelos de linguagens de programação possui noções nativas de "equivalência" (por exemplo, redução beta e conversão eta no cálculo lambda), portanto, também devemos incluí-las.
Qualquer relação de equivalência que escolhemos, isso nos dá alguma estrutura. Os algoritmos formam uma categoria em virtude do fato de serem a categoria quociente de programas. Sabe-se que algumas relações interessantes de equivalência dão origem a estruturas categóricas interessantes; por exemplo, a categoria de algoritmos recursivos primitivos é um objeto universal na categoria de categorias. Sempre que você vê uma estrutura interessante como essa, sabe que essa linha de investigação provavelmente será útil.