В КУРСЕ?

Разбираемся в теме

Массив отсортирован, а число пропало: как проверять сортировку в PascalABC.NET

Сортировка меняет порядок элементов массива, сохраняя сами данные. Поэтому последовательность, которая выглядит аккуратно, ещё может быть ошибочной: одно число потерялось, другое появилось лишний раз. Для школьной задачи полезно сразу проверять две вещи: правильный порядок и сохранение каждого значения с его количеством повторений. Рассмотрим небольшой целочисленный массив и сортировку соседними обменами. Такая трассировка помогает понять алгоритм до записи программы и обнаружить ошибку без угадывания.

Не путайте индекс, длину и значение

Индекс указывает место элемента, а значение хранится на этом месте. В динамическом массиве PascalABC.NET нумерация начинается с нуля. Если элементов четыре, допустимые индексы равны нулю, одному, двум и трём; длина массива при этом равна четырём. Статические массивы могут иметь другие заданные границы, поэтому правило про ноль нельзя переносить на все объявления. При сравнении соседей важно, чтобы существовал не только текущий элемент, но и следующий. Обращение за пределами массива приводит к исключению. В бумажной записи удобно рисовать индексы над ячейками, а значения внутри, чтобы перестановка чисел не выглядела перемещением самих мест.

Проследите один проход

Возьмём значения семь, три, семь, один. Двигаемся слева направо и меняем соседей местами, если левое значение больше правого. После сравнения первых двух получаем три, семь, семь, один. Средние семёрки менять не требуется. Последнее сравнение даёт три, семь, один, семь. Один проход завершён, но весь массив ещё не упорядочен: единица стоит после семёрки. При следующих проходах она постепенно переместится в начало. Этот пример показывает, почему нельзя остановиться только потому, что последний элемент оказался большим. Нужно проверять состояние всей последовательности или корректное условие завершения выбранного алгоритма.

Проверяйте порядок и сохранность одновременно

Для сортировки по неубыванию каждое следующее число должно быть не меньше предыдущего. Повторения допустимы: две одинаковые семёрки остаются двумя элементами. Правильный результат нашего примера равен один, три, семь, семь. Вариант один, три, семь уже упорядочен, но неполон. Вариант один, три, три, семь тоже упорядочен, однако количество троек и семёрок изменилось. Поэтому одной проверки соседних сравнений недостаточно. При реализации обмена убедитесь, что прежние значения сохранены до их перезаписи. Отдельно рассматривайте пустой массив, один элемент и уже упорядоченные данные: алгоритм не должен обращаться к несуществующему соседу.

Попробуйте на практике

Выполните бумажную сортировку четырёх чисел соседними обменами и проверьте результат. Компьютер и установка среды для упражнения не требуются.

  1. Нарисуйте четыре ячейки с индексами от нуля до трёх и запишите семь, три, семь, один. Отдельно отметьте, сколько раз встречается каждое число.
  2. Проведите первый проход слева направо. После каждого обмена переписывайте всю последовательность, не пропуская одинаковые значения.
  3. Повторяйте проходы по соседним парам, пока полный проход не пройдёт без обменов. Каждый раз проверяйте, что обращаетесь только к существующим ячейкам.
  4. Сравните итог с исходной записью: длину, количество каждого значения и порядок. Затем объясните, почему два ошибочных результата из разбора не проходят все проверки.

Как проверить результат. Итог равен один, три, семь, семь. Длина остаётся четыре, единица и тройка встречаются по одному разу, семёрка дважды; все соседние пары стоят в порядке неубывания.

Частые вопросы

Почему одинаковые числа нельзя просто удалить?

Удаление повторений решает другую задачу. Обычная сортировка должна сохранить все элементы, включая одинаковые значения, и изменить только их порядок.

Нужно ли всегда начинать обход с нулевого индекса?

Для динамического массива ноль является начальным индексом. У статического массива границы задаются при объявлении, поэтому алгоритм должен учитывать именно их.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов