无法在Delphi插入排序算法中找到简单错误

时间:2012-03-23 18:30:12

标签: delphi delphi-xe insertion-sort

我使用插入排序对字符串列表进行排序(下面的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 个答案:

答案 0 :(得分:3)

如果你想获得好成绩:

  1. 避免为变量提供误导性名称:

    • CurrentPointer应该被称为CurrentIndexCurrentPosition因为它是索引而不是指针
    • Pointer应避免使用(保留用于指针类型),因为它不是指针;应为WorkIndexWorkPosition
  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

  5. 更新:错过了基于零的数组的坏条件。

    2之二。条件应该是> = 0,而不是> 0

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