Новое знание №12



Posted by Владимир Секретев (24.42.161.96) on May 31, 2002 at 00:01:47:


Оператор SORT задает жесткую и не всегда удобную последовательность сортировки. Как задать ПРОИЗВОЛЬНУЮ
последовательность сортировки?

Реализация самого быстрого алгоритма сортировки Quick Sort для ФбП с возможностью задать ЛЮБОЙ закон сортирoвки! Алгоритм, примеры, пояснения.

Ищите знание №12 и приобретайте его на ПКП!


ОПИСАНИЕ

Алгоритм Quick Sort изложен в бессмертной книжке Вирта "Алгоритмы и структуры
данных". Этот алгоритм считается самым быстрым алгоритмом сортировки.

Предлагаемый вариант этого алгоритма на языке "ФбП" был сооружен тогда, когда
в программе еще не было ни массивов ни оператора SORT.

Однако, как показал практический опыт, и сейчас этот алгоритм не теряет своей
актуальности. Ко мне время от времени поступают запросы от разработчиков
помочь решить вопрос ПРОИЗВОЛЬНОЙ сортировки строковых массивов.

Дело в том, что встроенный алгоритм сортировки строго задает
последовательность символов, которая, в ряде случаев, не удобна.

Рассмотрим пример.

Предприятие торгует электронными компонентами. Вот их обозначения в
неупорядоченном виде так, как если бы они заносились в базу случайным образом:


a456
F0245
WE56000
G245rrr
g156YYY
we56001

А вот то же массив после выполнения операции SORT ARRAY A :


F0245
G245rrr
WE56000
a456
g156YYY
we56001

Обратите внимание, что в начало списка попали все слова, начинающиеся с
заглавной буквы, а в конец спика, слова, начинающиеся с маленькой буквы.

Это не удобно, а, часто, и не правильно. Как в нашем примере WE56000 и
we56001 очевидно должны располагаться рядом.

Предлагаемый алгоритм позволяет задать ЛЮБУЮ последовательность сортировки.
Закон сравнения задается содержимым строковой переменной OO.

Например:

OO := ABCDEFGHIJKLM......abcdef....АБВГД.....абвгдеж.....

Тогда последовательность сортировки будет как у оператора SORT.

Или второй вариант:

OO := AaBbCcDdEe.....АаБбГгДдЕеЁёЖж.....

Тогда последовательность сортировки будет иная, ближе, так сказать, к жизни.
Вот результат работы алгоритма с последовательностью сортировки, заданной
переменной OO как во втором варианте.

a456
F0245
G245rrr
g156YYY
WE56000
we56001


Пременная OO задана в поставляемом файле FIRST.RPT.
Вы можете ее переопределить как угодно в самом файле FIRST.RPT, а также,
вы можете определять ее значение в любой отчетной форме задавая наиболее
подходящий режим сортировки. В том числе, используя механизм аргументов,
вы можете определить несколько режимов сортировки для одной отчетной формы
как в примере EXMPL3.RPT. Для упрощения определения аргумента [f1]
воспользуйтесь поставляемым файлом SUPERVIS.FOF. Разместите его в той же
директории, что и клиентская часть.

Вот, например, еще одна идея, относительно содержимого этой переменной.

OO := 'AАaаБбВBвГгДдЕЕеeЁё....PРрр....'

Так построенная переменная OO позволяет правильно отсортировать даже те
списки, в которых латинские буквы перепутаны с кириллицей!

По всем вопросам обращайтесь по адресу vsekretev9146@rogers.com

Желаю успехов,
Владимир Секретёв





Пpишедшие ответы: