Переставить по алфавиту буквы слов в строке

Задача: 

Преобразовать строку так, чтобы буквы каждого слова в ней были отсортированы по алфавиту.

Алгоритм решения задачи: 

Решение данной задачи в общей сложности сводится к двум подзадачам. Это 1) найти индексы первого и последнего очередного слова, 2) отсортировать буквы между этими индексами. Эти две подзадачи должны выполняться столько раз, сколько слов в строке.

Вся строка в цикле перебирается посимвольно. Вводится флаговая переменная, которая сигнализирует о том, находимся ли мы внутри слова или нет. Если очередной символ не пробел и флаг показывает, что мы не в слове, то значит, текущий символ - первая буква слова. Присвоим его индекс переменной start, поменяем значение флаговой переменной (теперь она указывает, что мы внутри слова).

Если очередной символ не пробел, и флаг указывает, что мы внутри слова, то присвоим текущий индекс переменной finish. Если впоследствии за ним будет идти буква, то finish изменится, если же пробел - то эта переменная будет иметь индекс последней буквы слова.

Если встречается пробел, то флаг сбрасывается (мы вне слова). Также буквы с индексами от start до finish сортируются. Если после последнего слова строки нет пробела, то оно не будет отсортировано. Поэтому после цикла перебора символов строки выполняется еще одна сортировка.

Сортировка оформлена в виде отдельной процедуры. В качестве параметров передаются сама строка, начало и конец среза для сортировки. Используется сортировка выбором, т.к. можно использовать индексы непосредственно. В то время как в сортировке пузырьком находится разность между ними, что в данном случае приведет к ошибке.

Программа на языке Паскаль: 

var
    s: string;
    l, i, start, finish: byte;
    flag: boolean;
procedure sort(var s: string; first, last: byte);
    var
        max, i: byte;
        c: char;
    begin
        while last > first do begin
            max := first;
            for i:=first+1 to last do 
                if s[i] > s[max] then 
                    max := i;
            c := s[max];
            s[max] := s[last];
            s[last] := c;
            last := last - 1;
        end;
    end;
begin
    readln(s);
    l := length(s);
    start := 1;
    finish := 1;
    flag := False;
    for i:=1 to l do
        if s[i] = ' ' then begin
            flag := False;
            if start < finish then 
                sort(s,start,finish);
        end
        else
            if flag = False then begin
                flag := True;
                start := i;
            end
            else
                finish := i;
 
    if start < finish then // для последнего слова, когда после него не было пробела
        sort(s,start,finish);
 
    writeln(s);
end.

Пример выполнения программы:

  one  two    three   
  eno  otw    eehrt   

Комментарии

Вот решение попроще

var
  s: string;
  x: integer;
  c: char;
 
begin
  readln(s);
  x := 0;
  while x < length(s) - 1 do
  begin
    x := x + 1;
    if (s[x + 1] <> ' ') and (s[x + 1] < s[x]) then
    begin
      c := s[x];
      s[x] := s[x + 1];
      s[x + 1] := c;
      if x >= 2 then x := x - 2;
    end;
  end;
  writeln(s);
end.