друга в порядке, отличном от требуемого. Предположим, что сортируемый список состоит из n элементов. Сортировка мето-
дом пузырька начнется сравнением (и, возможно, перестановкой) элементов, стоящих на местах n и n – 1. Затем сравни-
ваются элементы, стоящие на местах n – 1 и n – 2, и так далее в направлении к началу списка, пока не будет выполнено срав-
нение (и, возможно, перестановка) первого и второго элементов списка. В результате прохождения по всему списку его наи-
меньший элемент будет вынесен на первое место. Аналогичным образом, после второго прохождения списка следующий по
величине элемент будет вынесен на второе место и т.д. Таким образом, пройдя список n – 1 раз, мы отсортируем его цели-
ком. (Если визуально представить себе работу данного алгоритма, то создается впечатление, что наименьшие из оставшихся
неупорядоченных элементов списка последовательно всплывают к его вершине как пузырьки, – отсюда и название алгорит-
ма.) Используя наш псевдокод, напишите процедуру сортировки списка методом пузырька по аналогии с процедурой, пред-
ставленной на рис. 4.11.
4.5. РЕКУРСИВНЫЕ СТРУКТУРЫ
Рекурсивные структуры являются другим видом повторяющихся структур. Цикл означает повторное выполнение набо-
ра команд, при этом весь набор команд полностью выполняется, а затем повторяется. Рекурсия же предполагает повторное
выполнение набора команд как подзадачу самой себя. Чтобы ввести понятие рекурсии, рассмотрим алгоритм двоичного по-
иска (binary search), в котором в процессе поиска применяется метод разбиения.
Поиск и сортировка. Алгоритмы последовательного и двоичного поиска – это всего лишь два представителя из большого семейст-
ва алгоритмов, осуществляющих поисковый процесс. (Использование для этой цели индексов и механизм перемешивания будет рас-
сматриваться в главе 8.) Аналогично, сортировка методом вставки – это лишь один из многих существующих алгоритмов сортиров-
ки. Другими классическими алгоритмами являются сортировка слиянием (обсуждается в главе 11), выборочная сортировка (ее опи-
сание можно найти в подразделе "Вопросы для самопроверки", п. 5 раздела 4.4), сортировка методом пузырька (см. подраздел "Вопросы
для самопроверки", п. 6, раздела 4.4), быстрая сортировка (применяющая к процессу сортировки принцип "разделяй и властвуй") и
древовидная сортировка (использующая искусную методику для нахождения элементов, которые следует переместить вверх по спи-
ску).
Описание этих алгоритмов вы сможете найти в книгах, указанных в списке дополнительной литературы в конце главы. Третий
том книги Дональда Кнута "Искусство программирования", хотя и сложен для восприятия начинающими, в целом может считаться
последним словом в области методик поиска и сортировки. В своем многотомном труде (который со временем может составить семь
томов) Кнут собрал невероятное количество информации, относящейся к фундаментальным алгоритмам вычислений, и тем самым внес
значительный вклад в библиотеки специалистов в области компьютерных наук и обработки данных.
Алгоритм двоичного поиска. Давайте вновь рассмотрим задачу поиска заданного элемента в отсортированном списке.
Но на этот раз подойдем к этому несколько иначе. Попытаемся использовать процедуру, которой мы обычно следуем при
поиске имени в телефонном справочнике. Человек никогда не просматривает справочник последовательно, элемент за эле-
ментом или даже страница за страницей. Мы просто открываем его примерно в том месте, где, как мы думаем, может нахо-
диться нужное имя. Если повезет, оно окажется именно там, в противном случае поиск придется продолжить. Однако в этой
точке мы уже сузим область поиска либо до начальной части справочника, предшествующей нашей текущей позиции, либо
до остальной части справочника, следующей за ней.
На рис. 4.12 этот подход, применяемый к произвольному отсортированному списку, описан с помощью псевдокода. В
данном случае мы не знаем примерного места расположения элементов, поэтому инструкции на рисунке предписывают на-
чинать работу с открытия списка на "среднем" элементе. Слово "средний" заключено в кавычки, поскольку вполне возмож-
но, что число элементов в списке будет четным, и тогда среднего элемента в строгом смысле этого слова просто не сущест-
вует. В этом случае условимся, что средним считается первый элемент второй половины списка.
Рис. 4.12. Принцип двоичного поиска
Если выбранный элемент не является искомым, то программа, приведенная на рис. 4.12, предлагает два варианта даль-
нейших действий (поиск или в начальной или конечной половине списка). В каждом из них предусматривается выполнения
вторичного поиска, осуществляемого процедурой с именем Search. Следовательно, чтобы завершить нашу программу, не-
обходимо создать подобную процедуру, описывающую, как осуществляется этот вторичный поиск. Заметим, что эта проце-
дура должна быть в состоянии удовлетворить запрос на поиск в пустом списке. Например, если показанной на рис. 4.12 про-
грамме будет передан список, состоящий из одного элемента, который не является искомым, то процедура Search будет
вызвана для поиска либо в подсписке, находящемся выше этого единственного значения, либо в подсписке, находящемся
ниже его, однако оба эти списка пусты.
В качестве искомой процедуры Search можно было бы использовать процедуру последовательного поиска, созданную
нами в предыдущем разделе, но это совсем не тот метод, который выбрал бы человек при поиске в телефонном справочнике.
Вероятно, он просто применил бы к оставшейся части справочника ту же процедуру, которой только что воспользовался для
всего справочника в целом. Другими словами, выбрал бы какой-то элемент, достаточно близкий к середине оставшейся части спи-
выбрать “средний” элемент как ПроверяемоеЗначение;
выполнить набор команд, соответствующий одному из
случаев:
Случай 1: ИскомоеЗначение = ПроверяемоеЗначение
{сообщить об успехе}
Случай 2: ИскомоеЗначение < ПроверяемоеЗначение
{применить процедуру Поиск для обнаружения
ИскомоеЗначение в верхней части Списка, и
сообщить о результате этого поиска}
Случай 3: ИскомоеЗначение > ПроверяемоеЗначение
{применить процедуру Поиск для обнаружения
ИскомоеЗначение в нижней части Списка, и
сообщить о результате этого поиска}