В наше время преподаватели программирования во многих вузах России становятся всё более требовательнее, и при сортировке линейных однонаправленных (не только) списков просят работать не с содержимым полей данных, а с самими указателями, поэтому я считаю, что данная тема будет актуальной.



Сортировка списка выбором

описание типов:

Type
tdata=string[15]; {может быть любой из известных типов}
tlist=^list;
list=record
data:tdata;
sled:tlist
end;



процедура создания списка
(обязательно с первым "пустым" элементом
для более удобной работы со списком при сортировке,
информация считывается построчно из текстового файла):

Procedure MakeList(var f:text; var first:tlist);
var
ukspis:tlist;
Begin
new(first);
new(first^.sled);
ukspis:=first^.sled;
readln(f,ukspis^.data);
while not eof(f) do
begin
new(ukspis^.sled);
ukspis:=ukspis^.sled;
readln(f,ukspis^.data);
ukspis^.sled:=nil;
end;
end;



процедура сортировки:

Procedure SortList_Choice(first:tlist);
Var
ukspis,firstnonsort,ukmin:tlist;

Procedure obmen(var uksp1,uksp2,first:tlist);
Var
uk1,uk2,uk3:tlist;
Begin
uk3:=first;
while uk3^.sled <> uksp1 do uk3:=uk3^.sled;

uk2:=first;
while uk2^.sled <> uksp2 do uk2:=uk2^.sled;

uk1:=uk2^.sled;
uk2^.sled:=uk3^.sled;
uk3^.sled:=uk1;

uk1:=uksp1^.sled;
uksp1^.sled:=uksp2^.sled;
uksp2^.sled:=uk1;

uk1:=uksp1;
uksp1:=uksp2;
uksp2:=uk1;
end; {obmen}

Begin
firstnonsort:=first^.sled;
ukmin:=first^.sled;
ukspis:=firstnonsort;
while firstnonsort <> nil do
Begin
ukspis:=firstnonsort;
ukmin:=ukspis;
while ukspis <> nil do
Begin
if ukspis^.data < ukmin^.data then ukmin:=ukspis;
ukspis:=ukspis^.sled
end;
obmen(firstnonsort,ukmin,first);
firstnonsort:=firstnonsort^.sled
end
end;



P.S. Все коды написаны лично мной (без использования ресурсов интернета), проверены на TurboPascal и отлично работают! Прикреплён исходник для самостоятельной проверки!
Нажмите для просмотра прикрепленного файла