給了你關於你的數據結構的建議,並看到了隨後的掙扎,我想把事情弄直,並更清楚地解釋我的意思。
你原來的代碼有兩個基本上沒有連接的數組。您可以交換一個數組中的項目,並且很容易忘記爲另一個數組執行此操作。它看起來像名字/年齡對真的不應該分開。這導致下面的類型聲明。
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;
我已經一個一個地寫了這個答案,這就是你應該如何處理這樣一個更大的問題。嘗試把它分解成更小的部分,每個部分都是可管理的。
您的數據結構錯誤。你沒有兩個數組。你有一個單一的數組,每個元素是一個名稱,值對。在繼續之前,請考慮切換到正確的數據結構。 –
@David,我有兩個數組。我將如何將它合併到一個多維數組中,然後繼續? – noob
你想'記錄數組'。在現代Delphi中,你可以使用'TList'。 –