Энциклопедия Turbo Pascal. Главы 1-4
Страница 13. Сортировка записей


 

Сортировка записей

     По-видимому в большинстве прикладных программ, где использу-
ется сортировка,  требуется сортировать  группы  данных.  Хорошим
примером этого является список почтовых корреспонденций, посколь-
ку в этом случае фамилия,  улица, город, страна и почтовый индекс
составляют  связанную  группу данных.  При сортировке таких групп
данных используется ключ сортировки в операциях сравнения,  но  в
операциях  обмена участвует вся запись целиком.  Для того,  чтобы
лучше понять этот процесс сначала создадим запись,  которая будет
содержать необходимую информацию. Если в качестве примера исполь-
зовать почтовый адрес, то запись может иметь следующий вид:
     type
        address = record
           name:   string[30];
           street: string[40];
           city:   string[20];
           state:  string[2];
           zip:    string[9];
        end;
     После описания адреса необходимо изменить  следующим образом
определение данного "DataItem":
     DataItem = address;
     После выполнения  этих  изменений нужно скорректировать блок
сравнений в алгоритме быстрой сортировки,  используя то поле, ко-
торое применяется в качестве ключа сортировки.  В приводимой ниже
версии быстрой сортировки в качестве ключа используется поле  фа-
милии "name".  Это означает,  что список почтовых корреспонденций
сортируется в алфавитном порядке фамилий.

       { быстрая сортировка записей с почтовым адресом }
       procedure QsRecord(var item: DataArray; count:integer);
         procedure qs(l, r:integer; var it:DataArray);
           var
             i, j: integer;
             x, y: DataItem;
           begin
             i := l; j := r;
             x := it[(l+r) div 2];
             repeat
               while it[i].name < x.name do i := i+1;
               while x.name < it[j].name do j := j-1;
             if i<=j then
             begin
               y := it[i];
               it[i] := it[j];
               it[j] := y;
               i := i+1; j := j-1;
             end;
           until i>j;
           if l<j then qs(l, j, it);
           if l<r then qs(i, r, it)
         end;
     begin
          qs(1, count, item);
     end; {конец быстрой сортировки записей}

 
« Предыдущая статья