Сортировка вставками – это простой алгоритм сортировки, который может быть реализован как для массивов чисел, так и для строк. В языке программирования Delphi, который использует Object Pascal, алгоритм сортировки вставками может быть полезен для образовательных целей, например, для выполнения учебных заданий. В данной статье мы рассмотрим типичные ошибки, которые могут возникнуть при реализации алгоритма сортировки вставками, и научимся их исправлять.
Описание проблемы
Пользователь столкнулся с проблемой, при которой алгоритм сортировки вставками не работал корректно. Он использовал два массива: один для имен (EmailingListArray[1]) и другой для соответствующих им электронных адресов (EmailingListArray[2]). При изменении одного массива изменялся и другой, так как они были связаны. Цель состояла в том, чтобы отсортировать массив имен, но в результате сортировки сортировались оба массива одновременно.
Анализ кода
Давайте подробно рассмотрим код пользователя:
// Сначала проверяем, что массив содержит правильные значения
for first := 0 to EmailingListArray[1].Count do
ShowMessage(EmailingListArray[1][first]);
// Затем выполняем сортировку
First := 0;
Last := EmailingListArray[1].Count;
for CurrentPointer := First +1 to Last-1 do
begin
CurrentValue := EmailingListArray[1][CurrentPointer];
CurrentValue2 := EmailingListArray[2][CurrentPointer];
Pointer := CurrentPointer + 1;
while ((EmailingListArray[1][Pointer] > CurrentValue) AND (Pointer > 0)) do
begin
EmailingListArray[1][Pointer+1] := EmailingListArray[1][Pointer];
EmailingListArray[2][Pointer+1] := EmailingListArray[2][Pointer];
Pointer := Pointer - 1;
end;
EmailingListArray[1][Pointer + 1] := CurrentValue;
EmailingListArray[2][Pointer + 1] := CurrentValue2; // Ошибка здесь!
end;
// Показываем сообщение в конце для проверки
ShowMessage('hello?');
Подтвержденный ответ
После анализа кода были выявлены следующие ошибки:
Неправильное использование имен переменных, что может привести к путанице. Например, CurrentPointer следует переименовать в CurrentIndex, а Pointer - в WorkIndex.
В алгоритме сортировки вставками индекс для сравнения должен уменьшаться, а не увеличиваться. Следует использовать WorkIndex := CurrentIndex - 1.
В Delphi индексация массивов начинается с нуля, следовательно, необходимо использовать диапазон от 0 до Count-1.
В строке EmailingListArray[2][WorkIndex + 1] := CurrentValue2; была допущена ошибка: вместо CurrentValue2 должна быть присвоена переменная CurrentValue, так как это значение, которое нужно вставить в отсортированную часть массива.
Условие в цикле while должно быть WorkIndex >= 0, чтобы избежать выхода за пределы массива.
Исправленный код будет выглядеть следующим образом:
// Проверка корректности массива
for first := 0 to EmailingListArray[1].Count do
ShowMessage(EmailingListArray[1][first]);
// Сортировка
First := 0;
Last := EmailingListArray[1].Count;
for CurrentIndex := First + 1 to Last do
begin
var CurrentValue := EmailingListArray[1][CurrentIndex];
var CurrentValue2 := EmailingListArray[2][CurrentIndex];
var WorkIndex := CurrentIndex - 1;
while ((EmailingListArray[1][WorkIndex] > CurrentValue) and (WorkIndex >= 0)) do
begin
EmailingListArray[1][WorkIndex + 1] := EmailingListArray[1][WorkIndex];
EmailingListArray[2][WorkIndex + 1] := EmailingListArray[2][WorkIndex];
WorkIndex := WorkIndex - 1;
end;
EmailingListArray[1][WorkIndex + 1] := CurrentValue;
EmailingListArray[2][WorkIndex + 1] := CurrentValue2;
end;
// Показать сообщение в конце для проверки выполнения сортировки
ShowMessage('hello?');
Альтернативный ответ
Если сортировка не затрагивает первый элемент, убедитесь, что алгоритм корректно обрабатывает начальный элемент массива. Это может потребовать отдельной проверки или изменения условий цикла.
Заключение
При реализации алгоритма сортировки вставками важно внимательно следить за индексами и правильно обрабатывать граничные условия. В данном случае исправление нескольких ошибок привело к успешной сортировке массивов.
Исправление ошибок в алгоритме сортировки вставками для массивов в Delphi, где неправильное управление индексами и передача переменных приводило к некорректной работе алгоритма.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.