Энциклопедия Turbo Pascal. Главы 9-11 - TurboSort
ОГЛАВЛЕНИЕ
TurboSort
Инструментарий баз данных предоставляет функцию TurboSort, которая является разновидностью QuickSort. Она может быть использована для сортировки любого типа данных, если их длина равна по меньшей мере двум байтам. QuickSort используется, так как это самая быстрая сортировка в большинстве ситуаций, как вы видели в Главе 1. TusboSort находится в файле SORT.BOX, который должен быть включен в каждую программу, использующую ее. TurboSort объявляется следующим образом
function TurboSort(ItemSize: integer): integer;
ItemSize - это размер данных, которые будут сортироваться; он должен быть вычислен с помощью SizeOf. Значение, возвращаемое TurboSort, интерпретируется, как показано в таблице 9-3. TurboSort может сортировать до 32767 элементов. Хотя функция будет пытаться сортировать их в оперативной памяти для скорости, она будет использовать временный файл на диске, когда это необходимо.
Таблица 9-3 Коды возврата TurboSort
-------------------------------------------------------------
Значение Смысл
-------------------------------------------------------------
0 Сортировка выполнена успешно
3 В компьютере нет достаточной памяти
8 Длина элемента меньше 2
9 Более 32767 входных элементов для сортировки
10 Ошибка записи на диск
11 Ошибка чтения с диска
12 Нет возможности создать временный файл на диске
--------------------------------------------------------------
InP, OutP и Less
TusboSort имеет три фазы работы: ввод данных, которые будут сортироваться, сортировка данных и вывод отсортированных данных. Для того, чтобы помочь TurboSort выполнить свою работу, вы должны создать три процедуры, называемые InP, OutP, Less. Данные процедуры декларируются как forward с помощью SORT.BOX, но вы должны создать действительную реализацию.
Процедура InP используется для передачи TurboSort данных, которые должны сортироваться, по одному элементу за раз. Действительная передача выполняется, используя SortRelease, которая также определена в SORT.BOX. Она объявляется следующим образом
procedure SortRelease(item);
Так как тип параметра item не задан, могут сортироваться данные любого типа. Простая процедура InP, которая считывает десять целых, введенных с клавиатуры, и передает их TurboSort для сортировки, показана ниже:
procedure InP;
var
f: integer;
begin
for i:=1 to 10 do ReadLn(data[i]);
for i:=1 to 10 do SortRelease(data[i]);
end; {InP}
Процедура OutP используется для поэлементного чтения отсортированных данных из TurboSort с помощью SortReturn, определенной в SORT.BOX. SortReturn объявляется следующим образом:
procedure SortReturn(item);
Так как тип параметра item не задан, то могут быть возвращены данные любого типа. Процедура OutP может не обладать информацией о том, сколько элементов данных будет возвращаться, поэтому функция SorEOS может быть использована для проверки на конец данных. Следующая простая процедура OutP может быть использована с целыми числами, генерируемыми процедурой InP, показанной ранее:
procedure OutP;
var
data: integer;
begin
repeat
SortReturn(data);
write(data,' ');
until SortEOS;
end; {OutP}
Функция Less является наиболее важной из трех рассматриваемых, так как она вызывается каждый раз, когда сравниваются два элемента. Функция Less возвращает TRUE, если первый аргумент меньше второго. Less декларирована в SORT.BOX, как имеющая два параметра, называемые Х и У, которые вы должны перекрыть с двумя логическими переменными, имеющими тот же самый тип, что и сортированные данные. Перекрытие реализуется с помощью команды alsolute. Например, данная версия Less может быть использована для сравнения двух целых переменных:
function Less;
var
first: char absolute X;
second: char absolute Y;
begin
Less := first < second;
end; {Less}
В качестве примера связи этих процедур рассмотрим короткую программу, которая считывает десять целых числе, сортирует их и отображает отсортированный список:
program simple_sort;
var
data: array [1..10] of integer;
result: integer;
{$i sort.box} {read in the sort routines}
procedure InP;
var
f: integer;
begin
for i:=1 to 10 do ReadLn(dara[i]);
for i:=1 to 10 do SortRelease(data[i]);
end; {InP}
function Less;
var
first: char absolute X;
second: char absolute Y;
begin
Less := first < second;
end; {Less}
procedure OutP;
var
data: integer;
begin
repeat
SortReturn(data);
write(data, ' ');
until SortEOS;
end; {OutP}
begin
result:=TurboSort(sizeOf(integer));
writeLn('sort result; ', result);
end.