← Все вопросы
сортировка массива пузырьком на паскале, не сортирует или сортирует наполовину
6
ОГЭ скоро, разбираю сортировку пузырьком. Вроде понял идею (соседей сравнивать и менять), но мой код сортирует криво — массив получается почти отсортированный, но пара чисел не на месте.
var
a: array[1..5] of integer = (5, 2, 8, 1, 9);
i, t: integer;
begin
for i := 1 to 4 do
if a[i] > a[i+1] then
begin
t := a[i];
a[i] := a[i+1];
a[i+1] := t;
end;
for i := 1 to 5 do write(a[i], ' ');
end.
Где ошибка?
2 ответа
12
✓ Принятый ответ — помог автору
Ты сделал только один проход по массиву, а пузырьку нужно несколько проходов — за один раз всё не отсортируется. Нужен второй (внешний) цикл, который повторяет проходы:
var
a: array[1..5] of integer = (5, 2, 8, 1, 9);
i, j, t: integer;
begin
for j := 1 to 4 do
for i := 1 to 4 do
if a[i] > a[i+1] then
begin
t := a[i];
a[i] := a[i+1];
a[i+1] := t;
end;
for i := 1 to 5 do write(a[i], ' ');
end.
Почему так:
- за один проход самое большое число 'всплывает' в конец, как пузырёк (отсюда название). Но остальные ещё не на местах.
- внешний цикл
jповторяет проходы, пока всё не встанет по порядку. Для массива из n элементов хватает n-1 проходов. - обмен через временную переменную
t— у тебя сделан правильно, нельзя простоa[i] := a[i+1], иначе число потеряется.
Запомни картинку: лёгкие пузырьки всплывают вверх по одному за проход — поэтому проходов нужно много.
4
тот самый обмен через третью переменную t — это вообще главное что надо запомнить про сортировки. без неё одно из чисел затирается. я для надёжности проговариваю 'спрятал в t, переложил, достал из t')
Ваш ответ
Войдите, чтобы ответить на вопрос.