Метод пузырька с флагом
Идея состоит в том, что если при выполнении прохода методом пузырька не было ни одного обмена элементов массива, то это означает, что массив уже отсортирован и остальные проходы не нужны.
Реализация алгоритма на паскале:
repeat
flag := False; { сбросить флаг }
for j:=N-1 downto 1 do
if A[j] > A[j+1] then
begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
flag := True; { поднять флаг }
end;
until not flag; { выход при flag=False }
Этот метод можно еще улучшить если добавить счетчик проходов. После одного прохода один элемент будет стоять на своем месте, а значит с ним сравнивать не имеет смыслы. Реализация улучшенного метода сортировки пузырьком с флажком:
i := 0;
repeat
i := i + 1;
flag := False; { сбросить флаг }
for j:=N-1 downto 1 do
if A[j] > A[j+1] then
begin
с := A[j];
A[j] := A[j+1];
A[j+1] := с;
flag := True; { поднять флаг }
end;
until not flag; { выход при flag=False }