Не могу найти простую ошибку в алгоритме Delphi Insertion Sort - PullRequest
1 голос
/ 23 марта 2012

Я использую сортировку вставкой для сортировки списка строк (EmailingListArray ниже). EmailingListArray[1] - это массив, содержащий имена. EmailingListArray[2] содержит соответствующие электронные письма. Я сортирую EmailingListArray[1], и когда что-то меняется внутри него, это также меняет второй массив, поэтому они сортируются вместе. Я знаю, что это неудобный способ делать вещи, но это для курсовой работы, и я хотел поместить где-то сортировку вставок, чтобы попытаться получить дополнительную оценку: L

Вот мой код

//quick check to make sure array contains correct values
for first := 0 to EmailingListArray[1].Count do
   ShowMessage(EmailingListArray[1][first]);

//then sort
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] := CurrentValue;
end;

  //show message at the end for a check
  ShowMessage('hello?');

Сообщение "привет?" по какой-то причине не отображается: S. Программа не вылетает или что-то в этом роде, поэтому на самом деле она должна показывать "привет?" в конце. Это не сортирует мои массивы тоже. Также я не уверен, что алгоритм написан правильно, я взял его из нашего учебника. Любая помощь будет высоко ценится!

1 Ответ

3 голосов
/ 24 марта 2012

Если вы хотите получить хорошую оценку:

  1. Избегайте вводящих в заблуждение имен для ваших переменных:

    • CurrentPointer следует называть CurrentIndex или CurrentPosition, поскольку это индекс, а не указатель
    • Pointer следует избегать (зарезервировано для Pointer type) и, более того, потому что это не Pointer; должно быть WorkIndex или WorkPosition
  2. Прочитайте алгоритм сортировки вставок ( wikipedia имеет простой псевдокод для массива с индексом от 0) и правильно его реализуйте:

    WorkIndex := CurrentIndex - 1; // - not + in your "Pointer := CurrentPointer + 1;"

  3. Получите ваш индексный диапазон from 0 to Count-1 для TStrings.

  4. Не перепутайте 2 массива:
    EmailingListArray[2][WorkIndex + 1] := CurrentValue2; // not CurrentValue

Обновление: Пропущено условие "Плохое время" для массива на основе нуля.

2bis. В то время как условие должно быть с> = 0, а не> 0

while ((EmailingListArray[1][WorkIndex] > CurrentValue) AND (WorkIndex >= 0)) do
...