Дав вам совет относительно структуры ваших данных и увидев последующую борьбу, я хочу разобраться и объяснить более четко, что я имею в виду.
В вашем исходном коде было два массива, которые по существу не были связаны между собой.Вы можете поменять элементы в одном массиве и легко забыть сделать это для другого массива.Мне кажется, что пары имя / возраст на самом деле не должны быть разделены.Это приводит к следующему объявлению типа.
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;
Я написал этот ответ по частям, и именно так вы должны подойтибольшая проблема, как это.Попробуйте разбить его на более мелкие кусочки, каждый из которых является управляемым.