Автор работы: Пользователь скрыл имя, 17 Сентября 2013 в 23:22, курсовая работа
Данные, хранящиеся на внешних устройствах, имеют большой объем, что не позволяет их целиком переместить в оперативную память, отсортировать с использованием одного из алгоритмов внутренней сортировки, а затем вернуть их на внешнее устройство. В этом случае осуществлялось бы минимальное количество проходов через файл, то есть было бы однократное чтение и однократная запись данных. Однако на практике приходится осуществлять чтение, обработку и запись данных в файл по блокам, размер которых зависит от операционной системы и имеющегося объема оперативной памяти, что приводит к увеличению числа проходов через файл и заметному снижению скорости сортировки.
ВВЕДЕНИЕ…………………………………………………………………………5
1 ПОСТАНОВКА ЗАДАЧИ…………………………………………………….....7
2 АЛГОРИТМИЧЕСКОЕ КОНСТРУИРОВАНИЕ………………………………8
2.1 ОБЩАЯ СХЕМА
ФУНКЦИОНИРОВАНИЯ………………………………………………8
2.2 ОЦЕНКА АЛГОРИТМА
СОРТИРОВКИ…………………………………………………………..................11
3 ПРОГРАММНОЕ КОНСТРУИРОВАНИЕ……………………………………..12
4 КОНТРОЛЬНЫЙ ПРИМЕР……………………………………………………...13
5 ЗАКЛЮЧЕНИЕ…………………………………………………………………...14
6 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………… 15
РЕФЕРАТ
Отчет 16с., 2р., 5 источников, 1 прил.
ЕСТЕСТВЕНОЕ СЛИЯНИЕ; ВНЕШНЯЯ СОРТИРОВКА
Объектом исследования являются алгоритм сортировки естественным слиянием.
Цель работы – реализация сортировки естественного слияния.
В работе рассматриваются теоретические и практические вопросы реализации сортировки, предназначенной для работы с файлами.
В результате проделанной работы была реализована сортировка естественного слияния.
СОДЕРЖАНИЕ
ВВЕДЕНИЕ…………………………………………………………
1 ПОСТАНОВКА ЗАДАЧИ……………………………………………………....
2 АЛГОРИТМИЧЕСКОЕ КОНСТРУИРОВАНИЕ………………………………8
2.1 ОБЩАЯ СХЕМА
ФУНКЦИОНИРОВАНИЯ……………………………………
2.2 ОЦЕНКА АЛГОРИТМА
СОРТИРОВКИ…………………………………………………
3 ПРОГРАММНОЕ КОНСТРУИРОВАНИЕ…………………………………….
4 КОНТРОЛЬНЫЙ ПРИМЕР………………………………
5 ЗАКЛЮЧЕНИЕ……………………………………………………
6 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ…………………………… 15
ПРИЛОЖЕНИЕ А. ТЕКСТЫ ОСНОВНЫХ ПРОГРАММНЫХ МОДУЛЕЙ….16
ВВЕДЕНИЕ
Алгоритмы внешней сортировки:
Внешняя сортировка – это сортировка данных, которые расположены на внешних устройствах и не вмещающихся в оперативную память.
Данные, хранящиеся на внешних устройствах, имеют большой объем, что не позволяет их целиком переместить в оперативную память, отсортировать с использованием одного из алгоритмов внутренней сортировки, а затем вернуть их на внешнее устройство. В этом случае осуществлялось бы минимальное количество проходов через файл, то есть было бы однократное чтение и однократная запись данных. Однако на практике приходится осуществлять чтение, обработку и запись данных в файл по блокам, размер которых зависит от операционной системы и имеющегося объема оперативной памяти, что приводит к увеличению числа проходов через файл и заметному снижению скорости сортировки.
Основным понятием при использовании внешней сортировки является понятие серии. Серия (упорядоченный отрезок) – это последовательность элементов, которая упорядочена по ключу.
Количество элементов в серии называется длиной серии. Серия, состоящая из одного элемента, упорядочена всегда. Последняя серия может иметь длину меньшую, чем остальные серии файлов. Максимальное количество серий в файле N (все элементы не упорядочены). Минимальное количество серий одна (все элементы упорядочены).
В основе большинства методов внешних сортировок лежит процедура слияния и процедура распределения.
Слияние – это процесс объединения двух (или более) упорядоченных серий в одну упорядоченную последовательность при помощи циклического выбора элементов, доступных в данный момент.
Распределение – это процесс разделения упорядоченных серий на два и несколько вспомогательных файла.
Фаза – это действия по однократной обработке всей последовательности элементов.
Двухфазная сортировка – это сортировка, в которой отдельно реализуется две фазы: распределение и слияние.
Однофазная сортировка – это сортировка, в которой объединены фазы распределения и слияния в одну.
Двухпутевым слиянием называется сортировка
Многопутевым слиянием
1. ПОСТАНОВКА ЗАДАЧИ
Реализация алгоритма внешней сортировки естественным слиянием.
2. АЛГОРИТМИЧЕСКОЕ КОНСТРУИРОВАНИЕ
2.1 ОБЩАЯ СХЕМА ФУНКЦИОНИРОВАНИЯ
Данная сортировка является улучшением сортировки слиянием и относится к внешним сортировкам.
Алгоритм сортировки слиянием был предложен Джоном фон Нейманом в 1945 году и является одним из самых простых алгоритмов сортировки среди «быстрых» алгоритмов.
Особенностью этого алгоритма является то, что он работает с элементами преимущественно последовательно, благодаря чему именно этот алгоритм используется при сортировке в системах с различными аппаратными ограничениями.
Сортировка слиянием относится к устойчивым методам сортировки.
Общий алгоритм сортировки слиянием
Сначала серии распределяются на два
или более вспомогательных
Выделим основные характеристики сортировки слиянием:
Сортировка естественным слиянием
В случае простого слияния частичная упорядоченность сортируемых данных не дает никакого преимущества. Это объясняется тем, что на каждом проходе сливаются серии фиксированной длины. При естественном слиянии длина серий не ограничивается, а определяется количеством элементов в уже упорядоченных подпоследовательностях, выделяемых на каждом проходе.
Сортировка, при которой всегда сливаются две самые длинные из возможных последовательностей, является естественным слиянием. В данной сортировке объединяются серии максимальной длины.
Алгоритм сортировки естественным слиянием
Шаг 1. Исходный файл f разбивается на два вспомогательных файла f1 и f2. Распределение происходит следующим образом: поочередно считываются записи ai исходной последовательности (неупорядоченной) таким образом, что если значения ключей соседних записей удовлетворяют условию f(ai)<=f(ai+1), то они записываются в первый вспомогательный файл f1. Как только встречаются f(ai)>f(ai+1), то записи ai+1 копируются во второй вспомогательный файл f2. Процедура повторяется до тех пор, пока все записи исходной последовательности не будут распределены по файлам.
Шаг 2. Вспомогательные файлы f1 и f2
Шаг 3. Полученный файл f вновь обрабатывается, как указано в шагах 1 и 2.
Шаг 4. Повторяя шаги, сливаем упорядоченные серии до тех пор, пока не будет упорядочен целиком весь файл.
Символ "`" обозначает признак конца серии.
Признаками конца сортировки естественным слиянием являются следующие условия:
Рис. 1 Иллюстрация действия алгоритма сотрировки естественным слиянием
2.2 ОЦЕНКА АЛГОРИТМА СОРТИРОВКИ
Время — основной параметр, характеризующий быстродействие алгоритма. Называется также вычислительной сложностью.
При сортировке естественным слиянием слиянию подвергаются упорядоченные подпоследовательности, называемые «сериями», длинной m и n, содержащиеся в двух файлах, и дающие результирующую последовательность из m+n элементов. В каждой серии элемент ri не больше, чем ri+1. Если сливаются две последовательности, каждая из n серий, то результирующая также содержит ровно n серий.
Следовательно, при каждом проходе общее число серий уменьшается вдвое и общее число пересылок в самом плохом случае равно n * log(n), а в среднем даже меньше. Ожидаемое число сравнений, однако, значительно больше, поскольку кроме сравнений, необходимых для отбора элементов при слиянии, нужны еще дополнительные сравнения между последовательными элементами каждого файла, чтобы определить конец серии.
Память — ряд алгоритмов требует выделения дополнительной памяти под временное хранение данных. Алгоритмы сортировки, не потребляющие дополнительной памяти, относят к сортировкам на месте.
Алгоритм сортировки естественным слиянием требует для своей работы создания двух вспомогательных файлов, содержащих в среднем по n\2 элементов исходного набора, в худшем случае один из файлов содержит n-1 элементов, а второй всего один. Дополнительных переменных для хранения промежуточных результатов не требуется.
3.ПРОГРАММНОЕ КОНСТРУИРОВАНИЕ
ТАБЛИЦА ПРОЦЕДУР И ФУНКЦИЙ
В данной таблице будет представлено две процедуры. Процедура сортировки Шелла и процедура сортировки вставками.
Процедуры и функции |
Передаваемые параметры |
Возвращаемое значение |
Описание |
Init |
- |
- |
Связывание файлов и файловых переменных |
Copy |
x, y: tape |
- |
Копирование элемента из файла x в файл y |
CopyRun |
x, y: tape |
- |
Копирование содержимого файла x в файл y |
Merge |
- |
- |
Слияние серии |
MergeRun |
- |
- |
Сортировка естественным слиянием |
Distribute |
- |
- |
Распределение |
6. КОНТРОЛЬНЫЙ ПРИМЕР
Рис. 2 Алгоритм естественного
слияния в действии
5. ЗАКЛЮЧЕНИЕ
Выполнение курсовой работы позволило более подробно изучить механизм работы и эффективность внешней сортировки естественным слиянием.
6 .СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Сайт «Википедиа» [Электронный ресурс]-URL:http:/ru.
2. www.cyberforum.ru
3. Вирт Н. «Алгоритмы и структуры данных программ»
4. Ахо А.В. Хопкрофт Д.Э. Ульман Д.Д. «Структура данных и алгоритмы»
5. Царев Р.Ю. «Структуры и алгоритмы обработки данных»
ПРИЛОЖЕНИЕ А. КОД ПРОГРАММЫ
program NaturalMerge;
uses
CRT;
type
item = record
key: integer;
end;
tape = file of item;
var
a, b, c: tape;
fin, res: text;
x: item;
n, p: char;
eor: Boolean;
l: integer;
procedure Init;
var
nameoffile: string;
begin
Writeln('Введите путь до файла:');
Read(nameoffile);
Assign(fin, nameoffile + '.txt');
Assign(a, 'a.txt');
Assign(b, 'b.txt');
Assign(c, 'c.txt');
Assign(res, 'res.txt');
reset(fin);
rewrite(c);
rewrite(res);
end;
procedure Copy(var x, y: tape);
var
bufa, bufb: item;
begin
read(x, bufa);
write(y, bufa);
if not eof(x) then
begin
read(x, bufb);
eor := bufa.key > bufb.key;
seek(x, filepos(x) - 1);
end
else
eor := true;
end;
procedure CopyRun(var x, y: tape);
begin
repeat
copy(x, y);
until eor;
end;
procedure MergeRun;
var
bufa, bufb: item;
begin
repeat
read(a, bufa);
read(b, bufb);
seek(a, filepos(a) - 1);
seek(b, filepos(b) - 1);
if bufa.key < bufb.key then
begin
copy(a, c);
if eor then
copyrun(b, c);
end
else
begin
copy(b, c);
if eor then
copyrun(a, c);
end;
until eor;
end;
procedure Merge;
begin
repeat
mergerun;
l := l + 1;
until eof(b) or eof(a);
while not (eof(a)) do
begin
copyrun(a, c);
l := l + 1;
end;
while not eof(b) do
begin
copyrun(b, c);
l := l + 1;
end;
end;
procedure Distribute;
begin
repeat
copyrun(c, a);
if not (eof(c)) then
copyrun(c, b);
until eof(c);
end;
begin
try
clrscr;
Init;
WriteLn;
Writeln('=====================
Writeln;
Writeln('Начальная последовательность: ');
while not eof(fin) do
begin
read(fin, x.key);
write(c, x);
write(x.key, ' ');
Информация о работе Внешняя сортировка естественным слиянием PascalABC.Net