- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •Введение
- •Классификация структур данных
- •Структура оперативной памяти
- •Лабораторная работа 1 методы сортировки постоянных таблиц и поиска в таблицах
- •Методические указания к выполнению работы
- •Определение операции сортировки
- •Линейный выбор (сортировка выбором)
- •Линейный выбор с подсчетом
- •Метод "пузырька"
- •{Описание типов}
- •Шейкер – сортировка
- •Метод вставки с прямым включением
- •Метод вставки с бинарным включением
- •Метод двухпутевой вставки
- •Метод Шелла
- •"Быстрая" сортировка (обменная сортировка с разделением)
- •Метод простого двухпутевого слияния (сортировка слиянием)
- •Метод естественного слияния (сортировка слиянием)
- •Дихотомический поиск по совпадению
- •Дихотомический поиск нескольких записей
- •Дихотомический поиск по близости
- •Дихотомический поиск по интервалу
- •Задание к лабораторной работе
- •Варианты заданий
- •Требования к выполнению лабораторной работы
- •Контрольные вопросы
- •Литература
- •Приложение а Примеры программ, выполняющих сортировку таблицы методом линейного выбора
- •Программа на языке с
- •Приложение в краткое описание системы turbo pascal
- •1. Структура pascal-программы
- •2. Простые типы
- •3. Составные типы
- •4. Операторы
- •5. Процедуры и функции
- •6. Файлы
- •7. Управление консолью
- •Содержание
- •Методические указания и задания
- •К лабораторным работам по курсу
- •«Алгоритмы и структуры данных»
- •(Для студентов обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
Шейкер – сортировка
Метод "пузырька" можно улучшить, если менять направления следующих один за другим проходов таблицы. Этот вариант метода назван шейкер – сортировкой. Его выгодно использовать в тех случаях, когда "легкие" пузырьки расположены в исходной таблице на противоположном ("тяжелом") конце.
Рассмотрим работу этого метода на том же примере, что и в методе "пузырька":
Начальные ключи |
Проходы |
|||
1 |
2 |
3 |
4 |
|
15 |
15 |
1 |
1 |
1 |
23 |
8 |
15 |
8 |
3 |
8 |
16 |
8 |
15 |
8 |
16 |
3 |
16 |
3 |
15 |
3 |
1 |
3 |
16 |
16 |
1 |
20 |
20 |
20 |
20 |
20 |
23 |
23 |
23 |
23 |
Шейкер – сортировка выполняется быстрее, чем сортировка "пузырьком" (число сравнений равно, примерно, (n*n)/4+n ).
Метод вставки с прямым включением
Метод вставки с прямым включением основывается на следующем утверждении: перед рассмотрением записи R[i] (i=2, 3, …, n) предыдущие записи R[1], R[2], ..., R[i-1] уже упорядочены (K[1]<=K[2]<=...<=K[i-1]), и для R[i] среди них должно быть найдено соответствующее место.
Рассмотрим i‑й шаг сортировки. Если K[i]<K[i-1], то запись R[i] запоминается в рабочей переменной (например, RAB), и ее ключ сравнивается поочередно с ключами записей R[j] (j=i-1, i-2, ..., 1) до тех пор, пока выполняется условие K[i]<K[j] или достигнут левый конец упорядоченной подтаблицы (j=0). Выполнение условия K[i]>=K[j] означает, что запись RAB нужно вставить между R[j] и R[j+1]. Чтобы подготовить место для вставки (позиция (j+1)), операции сравнения нужно чередовать с операциями перемещения записей на одну позицию (R[j+1]=R[j]). Завершается i-й шаг операцией R[j+1]=RAB.
Ниже показано выполнение i-го шага вставки. Ключевое значение записи R[i], равное 6, сравнивается с предыдущими ключами, и при необходимости записи перемещаются:
Процедура сортировки таблицы методом вставки с прямым включением имеет вид:
{описание типов}
Const Nmax=100;
Type rec=record
kl: integer;
inf: string[10]
end;
Table=Array[1..Nmax] of rec;
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
procedure VST (var T:Table; n:integer);
{Т- имя таблицы, n – размер таблицы, сортировка по полю kl}
var
i, j: integer;
rab: rec;
begin
for i:=2 to n do
if T[i].kl<T[i-1].kl then
begin
rab:=T[i];
j:=i-1;
while (j>0) and (rab.kl<T[j].kl) do
begin
T[j+1]:=T[j];
j:=j-1
end;
T[j+1]:= rab;
еnd;
end;
Количество операций сравнения для метода вставки определяется по формуле C = n (n – 1)/4. При достаточно большом n можно принять C = n2/4. Максимальное количество перестановок при использовании этого метода равно, примерно, n2/4.
Метод вставки обычно используется тогда, когда нужно внести записи в упорядоченную таблицу. Новая запись должна быть вставлена в таблицу таким образом, чтобы существующая упорядоченность не нарушилась.