Ну вот мой алгоритм, я не буду писать процедуры просто напишу работающую программу
Цитата
const
A=30;
t='.';
p=' ';
type
T_Array=array[1..A] of integer;
var
s1,sortpr:string;
i,j,k,n,cons,cons1:integer;
f,f1:boolean;
index,dlinna:T_Array;
begin
readln (s1);
sortpr:='';
i:=0;j:=0;k:=0;
 while i<>length(s1) do
  begin
     f:=false;
     i:=i+1;
     k:=i;
    repeat
      if (s1[i]=t) or (s1[i]=p) then
      begin
       f:=true;
       j:=j+1;
       end
      else i:=i+1;
    until f;
      n:=i-k;
      index[j]:=k;
      dlinna[j]:=n;
  end;
begin
   repeat
    f1 := FALSE;
    for j := 1 to A-1 do
      if dlinna[j] > dlinna[j+1] then
        begin
          cons := dlinna[j]; cons1:= index[j];
          dlinna[j] := dlinna[j + 1]; index[j]:= index[j+1];
          dlinna[j + 1] := cons; index[j+1]:=cons1;
          f1 := TRUE;
        end;
   until not f1;
end;
begin
   for j:=1 to a do
   for k:=1 to length(s1) do
   if (k>=index[j])and(k<=index[j]+dlinna[j]) then sortpr:=sortpr+s1[k];
end;
write(sortpr);
readln;
end.
все просто, берем строку считаем длинну от пробела до пробела или до точки (можно еще и другие символы но это не важно), записывам длинну слов и индексы начала слова в отдельные массивы, затем пузырьком сортируем длинны и индексы (в зависимости от длинны естественно) ну и в конце записываем все в новую строку по этим отсортированным массивам индексов и длинн...