- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •( Для студентов, обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
- •Введение
- •Классификация структур данных
- •Структура оперативной памяти
- •Лабораторная работа 1 методы сортировки постоянных таблиц и поиска в таблицах
- •Методические указания к выполнению работы
- •Определение операции сортировки
- •Линейный выбор (сортировка выбором)
- •Линейный выбор с подсчетом
- •Метод "пузырька"
- •{Описание типов}
- •Шейкер – сортировка
- •Метод вставки с прямым включением
- •Метод вставки с бинарным включением
- •Метод двухпутевой вставки
- •Метод Шелла
- •"Быстрая" сортировка (обменная сортировка с разделением)
- •Метод простого двухпутевого слияния (сортировка слиянием)
- •Метод естественного слияния (сортировка слиянием)
- •Дихотомический поиск по совпадению
- •Дихотомический поиск нескольких записей
- •Дихотомический поиск по близости
- •Дихотомический поиск по интервалу
- •Задание к лабораторной работе
- •Варианты заданий
- •Требования к выполнению лабораторной работы
- •Контрольные вопросы
- •Литература
- •Приложение а Примеры программ, выполняющих сортировку таблицы методом линейного выбора
- •Программа на языке с
- •Приложение в краткое описание системы turbo pascal
- •1. Структура pascal-программы
- •2. Простые типы
- •3. Составные типы
- •4. Операторы
- •5. Процедуры и функции
- •6. Файлы
- •7. Управление консолью
- •Содержание
- •Методические указания и задания
- •К лабораторным работам по курсу
- •«Алгоритмы и структуры данных»
- •(Для студентов обучающихся по направлению подготовки 6.050101 ”Компьютерные науки”)
Метод "пузырька"
Отличие метода "пузырька" от сортировки линейным выбором заключается в том, что вместо поиска наименьшей записи с последующей ее перестановкой две записи меняются местами сразу, как только обнаружится, что между ними нарушена упорядоченность.
В течение первого просмотра (прохода) таблицы сравниваются ключи первой (R[1]) и второй (R[2]) записей, и, если порядок между ними нарушен, то записи R[1] и R[2] меняются местами. Затем этот процесс повторяется для записей R[2] и R[3], R[3] и R[4],..., R[n-1] и R[n], причем при выполнении сравнения записи с меньшими ключами будут "всплывать" (то есть перемещаться на позицию с меньшим индексом). В результате первого прохода запись с наибольшим значением ключа "осядет" в позиции n. При втором проходе таблицы сравниваются ключи записей R[1] и R[2], R[2] и R[3],...,R[n-2] и R[n-1]. Запись с наибольшим значением ключа "осядет" в позиции (n-1).
Для сортировки таблицы требуется максимально (n-1) проходов, причем при каждом проходе один "пузырек" располагается на уровне, соответствующем его весу. Рассмотренный алгоритм можно сделать эффективнее, если после каждого прохода выполнять проверку: были ли совершены перестановки в течение данного прохода. Если перестановок не было, то это означает, что таблица уже отсортирована, и процесс можно завершить. Кроме того, можно запоминать не только сам факт, что обмен имел место, но и положение (индекс) последнего обмена. Это позволит уменьшить на следующем шаге просматриваемую часть таблицы.
Характеристики сортировки методом "пузырька" в худшем случае составляют сравнений и перестановок (худшим считается случай, когда записи наиболее удалены от своих конечных позиций). Среднее число сравнений и перестановок пропорционально n2 /2.
Рассмотрим пример сортировки методом "пузырька" (процедура, реализующая метод "пузырька" на языке Паскаль, приведена на рисунке 1):
Начальные ключи |
Проходы |
||||
1 |
2 |
3 |
4 |
5 |
|
15 |
15 |
8 |
8 |
3 |
1 |
23 |
8 |
15 |
3 |
1 |
3 |
8 |
16 |
3 |
1 |
8 |
8 |
16 |
3 |
1 |
15 |
15 |
15 |
3 |
1 |
16 |
16 |
16 |
16 |
1 |
20 |
20 |
20 |
20 |
20 |
20 |
23 |
23 |
23 |
23 |
23 |
{Описание типов}
Const Nmax=100;
Type
Rec=Record
kl : integer;
Inf : string [10];
End;
Table-=Array [1..Nmax] Of Rec;
. . . . . . . . . .
Procedure bubble (Var T:Table; n:integer);
{T – имя таблицы; n – размер таблицы (количество записей)}
{kl – ключ записи (поле сортировки)}
Var
i, k, m: integer;
pr: boolean;
zap: rec;
Begin
k:=n-1; pr:=true;
while (k>=1) and pr do
begin
pr:=false;
for i:=1 to k do
if T[i].kl > T[i+1].kl then
begin
zap:=T[i];
T[i]:=T[i+1];
T[i+1]:=zap;
m:=i;
pr:=true;
end;
k:=m-1;
end
end;
Рисунок 1 – Процедура сортировки таблицы методом "пузырька"