Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структуры и алгоритмы обработки данных. Часть 1. Учебное пособие
.pdf
21
Константы с плавающей точкой являются вещественными десятичными
числами со знаком. Их запись может включать в себя целую часть, десятичную
точку, дробную часть, символ экспоненты е или Е и показатель экспоненты в
виде целого числа со знаком:
[-]целая часть.[дробная] [E [+ | -]показатель] или
[-][целая часть].дробная [E [+ | -]показатель]
Знак минус перед константой рассматривается компилятором как арифметический оператор и поэтому вещественная отрицательная константа, по существу, является константным арифметическим выражением. В записи ве-
щественной константы может отсутствовать либо целая, либо дробная часть (но
не обе сразу). Отсутствие десятичной точки допустимо лишь при наличии экс-
поненты. Примеры возможных форм записи вещественных констант:
15.75 1.575E1 1575e-2 .1575E2 -.175e2 0.137 137. 137.0
1.6. Структуры данных
Под структурой данных в общем случае понимают множество элементов
данных и множество связей между ними.
Понятие "Физическая структура данных" отражает способ физического
представления данных в памяти машины и называется также структурой хранения, внутренней структурой или структурой памяти.
Рассмотрение структуры данных без учета ее представления в машинной
памяти называется абстрактной или логической структурой. В общем случае
между логической и соответствующей ей физической структурами существует
различие, степень которого зависит от самой структуры и особенностей той
среды, в которой она должна быть отражена. Вследствие этого различия суще-
ствуют процедуры, осуществляющие отображение логической структуры в фи-

22
зическую и, наоборот, физической структуры в логическую. Эти процедуры
обеспечивают, кроме того, доступ к физическим структурам и выполнение над
ними различных операций, причем каждая операция рассматривается примени-
тельно к логической или физической структуре данных.
Различаются простые (базовые, примитивные) структуры (типы) данных
и интегрированные (структурированные, композитные, сложные). Простыми
называются такие структуры данных, которые не могут быть расчленены на со-
ставные части большие, чем биты. С точки зрения физической структуры важ-
ным является то, что в данной машинной архитектуре, в данной системе программирования всегда можно заранее сказать, каков будет размер данного про-
стого типа и какова структура его размещения в памяти. С логической точки
зрения простые данные являются неделимыми единицами. Интегрированными
называются такие структуры данных, составными частями которых являются
другие структуры данных - простые или, в свою очередь, интегрированные.
Интегрированные структуры данных конструируются программистом с исполь-
зованием средств интеграции данных, предоставляемых языками программиро-
вания.
В зависимости от отсутствия или наличия явно заданных связей между
элементами данных следует различать несвязные структуры (векторы, массивы,
строки, стеки, очереди) и связные структуры (связные списки).
Весьма важным признаком структуры данных является ее изменчивость -
изменение числа элементов и (или) связей между элементами структуры. В
определении изменчивости структуры не отражен факт изменения значений
элементов данных, поскольку в этом случае все структуры данных имели бы
свойство изменчивости. По признаку изменчивости различают структуры ста-
тические, полустатические, динамические. Классификация структур данных по
признаку изменчивости приведена на рис. 1. Базовые структуры данных, стати-
ческие, полустатические и динамические характерны для оперативной памяти и

23
часто называются оперативными структурами. Файловые структуры соответ-
ствуют структурам данных для внешней памяти.
Рис. 1. Классификация структур данных
Важный признак структуры данных - характер упорядоченности ее элементов. По этому признаку структуры можно делить на линейные и нелинейные
структуры.
В зависимости от характера взаимного расположения элементов в памяти
линейные структуры можно разделить на структуры с последовательным рас-
пределением элементов в памяти (векторы, строки, массивы, стеки, очереди) и
структуры с произвольным связным распределением элементов в памяти (односвязные, двусвязные списки). Пример нелинейных структур - многосвязные
списки, деревья, графы.
В языках программирования понятие "структура данных" тесно связано с
понятием "тип данных".

24
2. Алгоритмы внутренней сортировки
При работе с интегрированными структурами очень часто возникает
необходимость перестановки элементов структуры в определенном порядке.
Такая задача называется сортировкой. Сортировку следует понимать именно
как процесс перегруппировки однотипных элементов структуры данных в не-
котором определенном порядке. Цель сортировки - облегчить последующий
поиск, обновление, исключение, включение элементов в структуру данных. На
отсортированных данных легче определить, имеются ли пропущенные элемен-
ты, все ли элементы проверены, легче найти общие элементы двух однотипных
структур, слить их воедино. Сортировка является важным средством для уско-
рения работы практически любого алгоритма, в котором требуется частое об-
ращение к определенным элементам структуры данных.
Разработано множество алгоритмов сортировки, однако нет алгоритма,
который был бы наилучшим в любом случае. Эффективность алгоритма сорти-
ровки может зависеть от ряда факторов, таких как число сортируемых элемен-
тов; степень отсортированности элементов; характеристики алгоритма (слож-
ность, требования к памяти и т.п.); место размещения элементов (в оперативной
памяти или на внешнем запоминающем устройстве).
Под внутренней сортировкой понимают разновидность алгоритмов сор-
тировки или их реализаций, при которой оперативной памяти достаточно для
помещения в неё сортируемого массива данных с произвольным доступом к
любой ячейке и, собственно, для выполнения алгоритма. В этом случае сорти-
ровка происходит максимально быстро, т.к. время обращения к периферийным
устройствам значительно выше, чем к оперативной памяти. В зависимости от
конкретного алгоритма и его реализации данные могут сортироваться в той же
области памяти либо использовать дополнительную оперативную память.
Внутренняя сортировка является базовой для любого алгоритма внешней сор-
тировки - отдельные части массива данных сортируются в оперативной памяти

25
и с помощью специального алгоритма сцепляются в один массив, упорядочен-
2
n
nn log
ный по ключу. Под внешней сортировкой понимают сортировку структур, не
помещающихся целиком во внутренней памяти.
Критериями оценки методов сортировки являются такие параметры как
количество операций сравнения пар ключей, число перестановок элементов, резерв памяти. Также часто учитываются следующие характеристики:
- время - параметр, характеризующий быстродействие алгоритма. Назы-
вается также вычислительной или временнОй сложностью. Зависит от быстро-
действия ЭВМ, размера структуры, количества операций сравнения. Для упо-
рядочения важны худшее, среднее и лучшее поведение алгоритма в терминах
размера структуры;
- устойчивость - устойчивая сортировка не меняет взаимного расположе-
ния равных элементов;
- естественность поведения - эффективность метода при обработке уже
упорядоченных или частично упорядоченных данных. Алгоритм ведёт себя
естественно, если учитывает эту характеристику входной последовательности и
работает лучше.
Среднее количество операций сравнения зависит от метода сортировки и
при рациональном выборе метода достигает некоторого минимума, зависящего
от n - размера структуры (количество содержащихся в ней записей). Методы
внутренней сортировки можно разделить на две группы:
- методы, не требующие резерва памяти;
- методы, требующие резерва памяти.
К первой группе относятся метод выборки, "пузырька", вставки, Шелла.
Ко второй группе относятся метод квадратичной выборки, метод слияния и
другие. Простые методы сортировки (выбором, обменом, вставкой) требуют
приблизительно
ют получение результата за
сравнений. Более сложные алгоритмы обычно обеспечива-
сравнений в среднем: сортировка методом

26
Шелла, слиянием, "быстрая сортировка". Однако лучшего для всех случаев ал-
Начальное состояние массива
8 23 5 65 44 33 1 6
Шаг 1
1 23 5 65 44 33 8 6
Шаг 2
1 5 23 65 44 33 8 6
Шаг 3
1 5 6 65 44 33 8 23
Шаг 4
1 5 6 8 44 33 65 23
Шаг 5
1 5 6 8 23 33 65 44
Шаг 6
1 5 6 8 23 33 65 44
Шаг 7
1 5 6 8 23 33 44 65
горитма сортировки не существует.
2.1. Сортировка выбором
При сортировке массива a[1], a[2], ..., a[n] методом простого выбора среди
всех элементов находится элемент с наименьшим значением a[i], и a[1] и a[i]
обмениваются значениями. Затем этот процесс повторяется для получаемых
подмассивов a[2], a[3], ..., a[n], ... a[j], a[j+1], ..., a[n] до тех пор, пока не дойдем
до подмассива a[n], содержащего к этому моменту наибольшее значение. Алго-
ритм проиллюстрирован в табл. 2, серым помечена еще неотсортированная
часть массива по итогам шага.
Таблица 2
Сортировка простым выбором
Для метода сортировки простым выбором требуемое число сравнений n*(n-1)/2. Порядок требуемого числа пересылок (включая те, которые требуют-
ся для выбора минимального элемента) в худшем случае составляет O(n
2
).

27
2.2. Сортировка включением
Начальное состояние массива
8 23 5 65 44 33 1 6
Шаг 1
8 23 5 65 44 33 1 6
Одним из наиболее простых и естественных методов внутренней сорти-
ровки является сортировка с простыми включениями. Идея алгоритма очень
проста. Пусть имеется массив ключей a[1], a[2], ..., a[n]. Для каждого элемента
массива, начиная со второго, производится сравнение с элементами с меньшим
индексом (элемент a[i] последовательно сравнивается с элементами a[i-1], a[i-2]
...) и до тех пор, пока для очередного элемента a[j] выполняется соотношение
a[j] > a[i], a[i] и a[j] меняются местами. Если удается встретить такой элемент
a[j], что a[j] <= a[i], или если достигнута нижняя граница массива, производится
переход к обработке элемента a[i+1] (пока не будет достигнута верхняя граница
массива).
В лучшем случае (когда массив уже упорядочен) для выполнения алгоритма с массивом из n элементов потребуется n-1 сравнение и 0 пересылок. В
худшем случае (когда массив упорядочен в обратном порядке) потребуется
n*(n-1)/2 сравнений и столько же пересылок. Таким образом, можно оценивать
сложность метода простых включений как O(n
2
).
Можно сократить число сравнений, применяемых в методе простых
включений, если воспользоваться тем фактом, что при обработке элемента a[i]
массива элементы a[1], a[2], ..., a[i-1] уже упорядочены, и для поиска элемента,
с которым должна быть произведена перестановка, воспользоваться методом
двоичного деления. Алгоритм проиллюстрирован в табл. 3, серым помечена
еще неотсортированная часть массива по итогам шага.
Таблица 3
Сортировка методом простого включения

28
Окончание табл. 3
Шаг 2
8 5 23 65 44 33 1 6
5 8 23 65 44 33 1 6
Шаг 3
5 8 23 65 44 33 1 6
Шаг 4
5 8 23 44 65 33 1 6
Шаг 5
5 8 23 44 33 65 1 6
Шаг 6
5 8 23 33 44 1 65 6
5 8 23 33 1 44 65 6
5 8 23 1 33 44 65 6
5 8 1 23 33 44 65 6
5 1 8 23 33 44 65 6
1 5 8 23 33 44 65 6
Шаг 7
1 5 8 23 33 44 6 65
1 5 8 23 33 6 44 65
1 5 8 23 6 33 44 65
1 5 8 6 23 33 44 65
1 5 6 8 23 33 44 65
2.3. Обменная сортировка (сортировка перестановками)
Простая обменная сортировка (часто называемая "методом пузырька")
для массива a[1], a[2], ..., a[n] работает следующим образом. Начиная с начала
массива сравниваются два соседних элемента (a[1] и a[2]). Если выполняется
условие a[1] > a[2], то значения элементов меняются местами. Процесс продолжается для a[2] и a[3] и т.д., пока не будет произведено сравнение a[n-1] и a[n].
После этого на месте a[n] окажется элемент массива с наибольшим значением.

29
На втором шаге процесс повторяется, но последними сравниваются a[n-2] и a[n-
Начальное состояние массива
8 23 5 65 44 33 1 6
Шаг 1
8 23 5 65 44 33 1 6
8 5 23 65 44 33 1 6
8 5 23 65 44 33 1 6
8 5 23 44 65 33 1 6
8 5 23 44 33 65 1 6
8 5 23 44 33 1 65 6
8 5 23 44 33 1 6 65
Шаг 2
5 8 23 44 33 1 6 65
5 8 23 44 33 1 6 65
5 8 23 44 33 1 6 65
5 8 23 33 44 1 6 65
5 8 23 33 1 44 6 65
5 8 23 33 1 6 44 65
1]. И так далее. На последнем шаге будут сравниваться только текущие значе-
ния a[1] и a[2]. Понятна аналогия с пузырьком, поскольку наименьшие элемен-
ты (самые "легкие") постепенно "всплывают" к верхней границе массива, а
наибольшие ("тяжелые") "тонут". Проходы по массиву повторяются n-1 раз или
до тех пор, пока на очередном проходе не окажется, что обмены больше не
нужны, что означает - массив отсортирован. Пример сортировки методом пузырька показан в табл. 4, серым помечена еще неотсортированная часть массива по итогам шага.
Таблица 4
Сортировка методом пузырька

30
Окончание табл. 4
Шаг 3
5 8 23 33 1 6 44 65
5 8 23 33 1 6 44 65
5 8 23 33 1 6 44 65
5 8 23 1 33 6 44 65
5 8 23 1 6 33 44 65
Шаг 4
5 8 23 1 6 33 44 65
5 8 23 1 6 33 44 65
5 8 1 23 6 33 44 65
5 8 1 6 23 33 44 65
Шаг 5
5 8 1 6 23 33 44 65
5 1 8 6 23 33 44 65
5 1 6 8 23 33 44 65
Шаг 6
1 5 6 8 23 33 44 65
1 5 6 8 23 33 44 65
Шаг 7
1 5 6 8 23 33 44 65
В лучшем случае для метода простой обменной сортировки требуется
один проход по массиву, чтобы выяснить, что перестановки не нужны. В худ-
шем случае число сравнений будет n*(n-1)/2.
2.4. Метод Шелла
Дальнейшим развитием метода сортировки с включениями является сор-
тировка методом Шелла, иначе называемая сортировкой включениями с
уменьшающимся расстоянием.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
