我使用插入排序对字符串列表进行排序(下面的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。 该程序没有崩溃或任何东西,所以它真的应该至少显示“你好?”在末尾。 它也没有对我的数组进行排序。 我也不确定算法是否写得正确,我从教科书中得到了它。 任何帮助将不胜感激!
答案 0 :(得分:3)
如果你想获得好成绩:
避免为变量提供误导性名称:
CurrentPointer
应该被称为CurrentIndex
或CurrentPosition
因为它是索引而不是指针Pointer
应避免使用(保留用于指针类型),因为它不是指针;应为WorkIndex
或WorkPosition
阅读插入排序算法(wikipedia有一个简单的伪代码,用于从0索引的数组)并正确实现:
WorkIndex := CurrentIndex - 1; // - not + in your "Pointer := CurrentPointer + 1;"
获取from 0 to Count-1
的索引范围TStrings
。
不要混淆2个阵列:
EmailingListArray[2][WorkIndex + 1] := CurrentValue2; // not CurrentValue
更新:错过了基于零的数组的坏条件。
2之二。条件应该是> = 0,而不是> 0
while ((EmailingListArray[1][WorkIndex] > CurrentValue) AND (WorkIndex >= 0)) do