← Все вопросы

сортировка массива пузырьком на паскале, не сортирует или сортирует наполовину

Задан 7 месяцев назад1к просмотров2 ответа
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')

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект