Алгоритмы

 

1.1 Основные определения: алгоритм, вход, результат; понятие правильного и неправильного алгоритма; псевдокод

 

 

Алгоритм – это формально описанная вычислительная процедура, получающая исходные данные (вход) и возвращающая результат (выход). Алгоритмы строятся для решения тех или иных вычислительных задач, при этом они должны удовлетворять следующим противоречащим друг другу требованиям:

 

1) Быть простым для понимания, перевода в программный код и отладки;

2) Эффективно использовать вычислительные ресурсы.

 

Алгоритм считают правильным (correct), если на любом допустимом входе он заканчивает работу и выдает результат, удовлетворяющий требованиям задачи. В этом случае говорят, что алгоритм решает (solve) данную вычислительную задачу. Неправильный алгоритм для некоторого входа может вообще не остановиться или дать неправильный результат. Алгоритм может быть описан различными способами, в том числе и при помощи псевдокода, принадлежащего более высокому уровню абстракции по сравнению с языками программирования высокого уровня (C#, Pascal, Basic и т.д.). В математическом пакете MathCAD при написании кода функций, определяемых пользователем, используется нотация, напоминающая описываемый ниже псевдокод.

 

Таблица 1.1 - Соглашения, лежащие в основе псевдокода

Описание
Отступ от левого поля указывает на уровень вложенности (это позволяет отказаться от применения begin и end)
Комментарий обозначается символом “►”.
Циклы while, for, repeat и условные конструкции имеют тот же смысл, что и в языке Pascal.
Символ “¬” имеет смысл оператора присваивания.
Запись i ¬ j ¬ e обозначает j ¬ e; i ¬ j или i ¬ e.
Переменная, обозначающая массив или объект, считается указателем на составляющие его данные.
Все переменные (по-умолчанию) – локальные.
Оператор доступа к элементу массива пишется в квадратных скобках [].
Запись “A[1..j]” обозначает A[1], A[2], A[3]..A[j].
Доступ к полю (field) объекта (object): field[object].
Параметры в подпрограмму передаются по-значению (by value), но при передаче объекта его свойства копируются в виде указателей. Т.е. если в качестве параметра передается объект x, то присваивание x ¬ y снаружи заметить нельзя, а f [x] ¬ 5 можно.

В качестве примера, позволяющего оценить различия между псевдокодом и алгоритмическим языком, рассмотрим сортировку вставками.

 

 

Листинг 1.1 – Псевдокод алгоритма сортировки вставками

 

procedure InsertSort(n: integer;

var A: array[1..n] of integer);

var

i, j, Tmp: integer;

begin

for i := 2 to n do begin

{Сохраняем текущий элемент}

Tmp := A[i];

{Сдвигаем элементы, большие, чем текущий}

j := i-1;

while (A[j] > Tmp) and (j > 1) do begin

A[j+1] := A[j];

j := j-1;

end;

{Вставляем текущий элемент}

A[j+1] := Tmp;

end;

end;

 

 

Листинг 1.2 – Сортировка вставками