在向您提供有关数据结构的建议并看到随后的困难之后,我想把事情说清楚并更清楚地解释我的意思。
您的原始代码有两个基本上未连接的数组。您可能会交换一个数组中的项目,但很容易忘记在另一个数组中这样做。在我看来,姓名/年龄对确实不应该分开。这导致以下类型声明。
type
TPerson = record
Name: string;
Age: Integer;
end;
现在你需要保存一个数组TPerson
.
type
TPersonArray = array of TPerson;
为了执行排序,您需要能够比较两个项目并交换它们。
function Compare(const Person1, Person2: TPerson): Integer;
begin
Result := CompareText(Person1.Name, Person2.Name);
end;
procedure Swap(var Person1, Person2: TPerson);
var
temp: TPerson;
begin
temp := Person1;
Person1 := Person2;
Person2 := temp;
end;
现在我们可以用冒泡排序将所有这些放在一起。
procedure Sort(var People: TPersonArray);
var
i, n: Integer;
Swapped: Boolean;
begin
n := Length(People);
repeat
Swapped := False;
for i := 1 to n-1 do begin
if Compare(People[i-1], People[i])>0 then begin
Swap(People[i-1], People[i]);
Swapped := True;
end;
end;
dec(n);
until not Swapped;
end;
现在,如果您想使用更复杂的比较运算符,那么您可以简单地替换Compare
。例如,如果您想按年龄对同名的任何人进行排序,则可以使用字典比较函数。
function Compare(const Person1, Person2: TPerson): Integer;
begin
Result := CompareText(Person1.Name, Person2.Name);
if Result=0 then begin
Result := Person2.Age-Person1.Age;
end;
end;
我已经一点一点地写下了这个答案,这就是你应该如何处理像这样的更大的问题。尝试将其分解为更小的部分,每个部分都是可以管理的。