Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основные понятия.rtf
Скачиваний:
18
Добавлен:
01.04.2015
Размер:
318 Кб
Скачать
☆

Введение

В этой лекции мы разбираем основные понятия и методы, связанные с построе­нием и анализом алгоритмов, на примере двух алгоритмов сортировки — прос­тейшего алгоритма сортировки вставками и более эффективного алгоритма сортировки слиянием.

На этих примерах мы познакомимся с обозначениями для скорости роста функций, методом «разделяй и властвуй» построения алгоритмов, а также с другими понятиями, которые будут встречаться нам на протяжении всей книги.

Алгоритмы

Алгоритм (algorithm) —это формально описанная вычислительная процеду­ра, получающая исходные данные (input), называемые также входом алгоритма или его аргументом, и выдающая результат вычислений на выход (output).

Алгоритмы строятся для решения тех или иных вычислительных задач (computational problems). Формулировка задачи описывает, каким требовани­ям должно удовлетворять решение задачи, а алгоритм, решающий эту задачу, находит объект, этим требованиям удовлетворяющий.

В этой главе мы рассматриваем задачу сортировки (sorting problem); по­мимо своей практической важности эта задача служит удобным примером для иллюстрации различных понятий и методов. Она описывается так:

Вход: Последовательность п чисел (а1, а2,… , ап).

Выход: Перестановка (а'1, а'2,…, а'п) исходной последовательности, для которой а'1≤ а'2≤… ≤а'п

Например, получив на вход (31,41,59,26,41,58), алгоритм сортировки должен выдать на выход (26,31,41,41,58,59).

Подлежащая сортировке последовательность называется входом (instance) задачи сортировки.

Многие алгоритмы используют сортировку в качестве промежуточного ша­га. Имеется много разных алгоритмов сортировки; выбор в конкретной ситуа­ции зависит от длины сортируемой последовательности, от того, в какой степени она уже отсортирована, а также от типа имеющейся памяти (оперативная память, диски, магнитные ленты).

Алгоритм считают правильным (correct), если на любом допустимом (для данной задачи) входе он заканчивает работу и выдает результат, удовлетворяю­щий требованиям задачи. В этом случае говорят, что алгоритм решает (solves) данную вычислительную задачу. Неправильный алгоритм может (для некоторо­го входа) вовсе не остановиться или дать неправильный результат. (Впрочем, неправильный алгоритм может быть полезен, если ошибки достаточно редки. Подобная ситуация встретится нам в главе 33 при поиске больших простых чисел. Но это всё же скорее исключение, чем правило.)

Алгоритм может быть записан на русском или английском языке, в виде компьютерной программы или даже в машинных кодах — важно только, чтобы процедура вычислений была чётко описана.

Мы будем записывать алгоритмы с помощью псевдокода (pseudocode), ко­торый напомнит вам знакомые языки программирования (Си, Паскаль, Алгол). Разница в том, что иногда мы позволяем себе описать действия алгоритма «своими словами», если так получается яснее. Кроме того, мы опускаем тех­нологические подробности (обработку ошибок, скажем), которые необходимы в реальной программе, но могут заслонить существо дела.

Сортировка вставками

Сортировка вставками (insertion sort) удобна для сортировки коротких по­следовательностей. Именно таким способом обычно сортируют карты: держа в левой руке уже упорядоченные карты и взяв правой рукой очередную карту, мы вставляем её в нужное место, сравнивая с имеющимися и идя справа налево (рис. 1.1).

Запишем этот алгоритм в виде процедуры Insertion-Sort, параметром которой является массив А[1..п] (последовательность длины n, подлежащая сортировке). Мы обозначаем число элементов в массиве А через length[A]. Последовательность сортируется «на

5

2

4

6

1

3

2

5

4

6

1

3

2

4

5

6

1

3

2

4

5

6

1

3

1

2

4

5

6

3

1

2

3

4

5

6

Рис. 1. Работа процедуры Insertion-Sort для входа А = (5,2,4,6,1,3). Позиция j пока­зана жирными числами.

месте», без дополнительной памяти (in place): помимо массива мы используем лишь фиксированное число ячеек памяти. После выполнения процедуры Insertion-Sort массив А упорядочен по возрастанию.

1 for (j=2;j<=n;j++){

2 key=A[j];

3 i=j-1;

4 while (i>0 && A[i]>key){

5 A[i+1]=A[i];

6 i=i-1;

7 }

8 A[i+1]=key;

9 }

На рис. 1.2 показана работа алгоритма при А = (5,2,4,6,1,3). Участок A[1.. j-1] составляют уже отсортированные карты, a A[j + 1..n] — ещё не просмотренные. В цикле for индекс j пробегает массив слева направо. Мы берём элемент A[j] (строка 2 алгоритма) и сдвигаем идущие перед ним и большие его по величине элементы (начиная с (j-1)-го) вправо, освобождая место для взято­го элемента (строки 3-6). В строке 8 элемент A[j] помещается на освобождённое место.