ROCEDURE MergeSort1 (VAR Txt: TEXT);
VAR
Temp1, Temp2: TEXT;
Sorted, Ch: CHAR;
{включает в себя процедуру CopyOpen(VAR F1, F2: TEXT)
Копирует строку из F1 в F2 без выполнения RESET и REWRITE;
поэтому F1 должен быть открыт для чтения, а F2 для записи,
а строки прошлого в этих файлах могут не быть пустыми}
BEGIN {MergeSort1}
{присвоить переменной Sorted значение ‘Y’ если Txt отсортирован, иначе - ‘N’ };
{разделить n символов в Txt на n серий единичной длины, разделенные символом ‘ #’ };
WHILE Sorted = ‘N’
DO
BEGIN
{разделить n/k серий длины k из Txt в n/2k серий в файлах Temp1 и Temp2};
{соединить n/2k серий длины k из файлов Temp1 и Temp2 в n/2k серий длины 2k в файл Txt};
{присвоить переменной Sorted значение ‘Y’ если файл Txt отсортирован, иначе присвоить ‘N’};
END
END {MergeSort1}
10.2.2 Слияние серий.
Когда количество серий нечетно, он не могут быть просто разделен на 2 файла, например, rw#ac#ot# разделяется на rw#ot# и ac#. Таким образом, во время слияния после того, как один разделенный файл буд полностью считан, другой еще может содержать одну серию, которая должна быть скопирована в в объединенный файл без каких-либо сравнений.
Раздел проекта
{соединить n/2k серий длины k из файлов Temp1 и Temp2 в n/2k серий длины 2k в файл Txt};
будет спроектирован как вызов процедуры
MergeRuns(Temp1, Temp2, Txt)
объявленной как:
Design Part 2.1
PROCEDURE MergeRuns(VAR In1, In2, Result: TEXT);
{склеивает серии из In1 и In2 в Result }
VAR
Ch1, Ch2: CHAR;
BEGIN {MergeRuns}
{инициализируем параметры файлов}
WHILE NOT EOLN(In1) AND NOT EOLN(In2)
DO
BEGIN
{склеиваем серии из In1 и In2 в Result}
END
{копируем последнюю серию из In1 или In2 (если такая имеется) в Result};
{сбрасываем параметры файлов}
END{MergeRuns}
Во время слияния, символы, содержащиеся в одной из двух серий, будут потрачены первыми. Таким образом, остаток из первой или второй серии необходимо будет скопировать в результирующий файл.
Design Part 2.1.1
BEGIN {копируем серии из In1 и In2 в Result}
READ(In1, Ch1);
READ(In2, Ch2);
WHILE (Ch1 <> ‘#’) AND (Ch2 <> ‘#’)
DO
{копируем меньший символ из Ch1 и Сh2 в Result и считываем
следующий символ из соответствующего файла};
{копируем остаток серии In1};
{копируем остаток серии In2};
WRITE(Result, ‘#’)
END