Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΠΉΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΎΠ΄Ρ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ Π΄ΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΊΠ°ΡΡΡ. ΠΠΎ Π²ΡΠΎΡΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ Π΄Π²ΠΎΠΉΠΊΠ°. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΡΠ΅ΡΠ΅Π΄ΠΎΠ²Π°ΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΎΠ² Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π° Π²ΡΡ ΠΊΠΎΠ»ΠΎΠ΄Π°.
ΠΠΈΡΡΠΈΠ½Π³ 5.5. Π¨Π΅ΠΉΠΊΠ΅Ρ-ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°
procedure TDShakerSort(aList :TList;
aFirst : integer; aLast : integer;
aCompare : TtdCompareFunc);
var
i : integer;
Temp : pointer;
begin
TDValidateListRange(aList, aFirst, aLast, 'TDShakerSort');
while (aFirst < aLast) do
begin
for i := aLast downto succ(aFirst) do
if (aCompare(aList.List^[i], aList.List^[i-1]) < 0) then begin
Temp := aList.List^[i];
aList.List^[i] := aList.List^[i-1];
aList.List^[i-1] := Temp;
end;
inc(aFirst);
for i := succ(aFirst) to aLast do
if (aCompare(aList.List^[i], aList.List^[i-1]) < 0) then begin
Temp := aList.List^[i];
aList.List^[i] := aList.List^[i-1];
aList.List^[i-1] := Teilend;
dec(aLast);
end;
end;
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΡΠ΅ΠΉΠΊΠ΅Ρ-ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ° O(n(^2^)), Π²ΡΠ΅ΠΌΡ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π΄Π»Ρ ΠΏΡΠ·ΡΡΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ. ΠΡΠΈΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π½Π°Π·Π²Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ΠΉΠΊΠ΅Ρ-ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΊΠΎΠ»Π΅Π±Π»ΡΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ²ΠΎΠΈΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΉ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΡΠΏΠΈΡΠΎΠΊ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½.
ΠΠ°ΠΊ ΠΈ ΠΏΡΠ·ΡΡΡΠΊΠΎΠ²Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°, ΡΠ΅ΠΉΠΊΠ΅Ρ-ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π½Π΅ΡΡΡΠΎΠΉΡΠΈΠ²ΡΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ.
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ°
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ, Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ° (selection sort). ΠΡΠΎ ΠΏΠΎΠΊΠ° ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΏΠΎΠ²ΡΠ΅Π΄Π½Π΅Π²Π½ΠΎΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ (ΠΎ ΠΏΡΠ·ΡΡΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ ΠΈ ΡΠ΅ΠΉΠΊΠ΅Ρ-ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΆΠ΅ Π·Π°Π±ΡΡΡ).
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΊΡΠ°Ρ ΠΊΠΎΠ»ΠΎΠ΄Ρ, ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΡΠ΅ ΠΊΠ°ΡΡΡ ΠΈ Π½Π°ΠΉΠ΄ΠΈΡΠ΅ ΡΠ°ΠΌΡΡ ΠΌΠ»Π°Π΄ΡΡΡ (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ ΡΡΠ·). ΠΠΎΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΡΠ· Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ. Π’Π΅ΠΏΠ΅ΡΡ, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΠΊΠ°ΡΡΡ, ΡΠ½ΠΎΠ²Π° ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΡΡ ΠΊΠΎΠ»ΠΎΠ΄Ρ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΡΠ°ΠΌΠΎΠΉ ΠΌΠ»Π°Π΄ΡΠ΅ΠΉ ΠΊΠ°ΡΡΡ. ΠΠΎΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΌΠ»Π°Π΄ΡΡΡ ΠΊΠ°ΡΡΡ ΡΠΎ Π²ΡΠΎΡΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ. ΠΠ°Π»Π΅Π΅, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΏΠ΅ΡΠ²ΡΠ΅ Π΄Π²Π΅ ΠΊΠ°ΡΡΡ, ΠΏΡΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π²ΡΡ ΠΊΠΎΠ»ΠΎΠ΄Ρ ΡΠΏΡΠ°Π²Π° Π½Π°Π»Π΅Π²ΠΎ Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΡΠ°ΠΌΠΎΠΉ ΠΌΠ»Π°Π΄ΡΠ΅ΠΉ ΠΊΠ°ΡΡΡ ΠΈ ΠΏΠΎΠΌΠ΅Π½ΡΠΉΡΠ΅ Π½Π°ΠΉΠ΄Π΅Π½Π½ΡΡ ΠΊΠ°ΡΡΡ Ρ ΡΡΠ΅ΡΡΠ΅ΠΉ ΠΊΠ°ΡΡΠΎΠΉ. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²ΡΡ ΠΊΠΎΠ»ΠΎΠ΄Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π°. ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΡΠΈΠ½Π°Π΄ΡΠ°ΡΡΠΉ ΡΠΈΠΊΠ» Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠ°ΡΡΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΊ ΡΠΎΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 5.6. Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ°
procedure TDSelectionSort(aList : TList;
aFirst : integer; aLast : integer;
aCompare : TtdCompareFunc);
var
i, j : integer;
IndexOfMin : integer;
Temp : pointer;
begin
TDValidateListRange(aList, aFirst, aLast, 'TDSelectionSort');
for i := aFirst to pred(aLast) do
begin
IndexOfMin := i;
for j := succ(i) to aLast do
if (aCompare(aList.List^[j], aList.List^[IndexOfMin]) < 0) then
IndexOfMin := j;
if (aIndexOfMin <> i) then begin
Temp := aList.List^[i];
aList.List^[i] := aList.List^[IndexOfMin];
aList.List^[IndexOfMin] := Teilend;
end;
end;
Π ΠΈΡΡΠ½ΠΎΠΊ 5.3 Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ°
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, Π² ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΡΠ½ΠΎΠ²Π° ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ Π΄Π²Π° Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΡΠΈΠΊΠ»Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°ΠΌ ΠΊΠ»Π°ΡΡΠ° O(n(^2^)). Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠΈΠΊΠ»Π΅ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΎΡ aFast Π΄ΠΎ aLast-1 ΠΈ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΅Π³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²ΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΌ ΡΠΈΠΊΠ»Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ Π² ΠΎΡΡΠ°Π²ΡΠ΅ΠΉΡΡ ΡΠ°ΡΡΠΈ ΡΠΏΠΈΡΠΊΠ°. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° Ρ ΠΊΠ°ΡΡΠ°ΠΌΠΈ, Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ» Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ Π·Π½Π°Π΅Ρ, ΠΊΠ°ΠΊΠΎΠ²ΡΠΌ Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ. ΠΠΎΡΠ»Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΎΠ½ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ.
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΎΠ΄Π½ΠΎΠΉ ΡΠ²ΠΎΠ΅ΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ. ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡ ΠΎΠ΄Π° ΡΠ°Π²Π½ΠΎ n, Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ - n-1 ΠΈ Ρ.Π΄. ΠΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π½ΠΎ n (n + 1)/2 = 1, Ρ.Π΅. ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊ ΠΊΠ»Π°ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² O(n(^2^)). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅: ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΈΠΊΠ»Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ Π²ΡΠ΅Π³ΠΎ ΠΎΠ΄Π½Π° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΎΠ±ΡΠ΅Π΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ (n - 1), Ρ.Π΅. O(n). Π§ΡΠΎ ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅? ΠΡΠ»ΠΈ ΡΡΠΎΠΈΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (ΠΏΠΎΠ΄ ΡΡΠΎΠΈΠΌΠΎΡΡΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΡΠ΅ΡΡΡΡΡ), ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ° ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ.
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ° ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ Π³ΡΡΠΏΠΏΠ΅ ΡΡΡΠΎΠΉΡΠΈΠ²ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ². ΠΠΎΠΈΡΠΊ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΠΌΠ΅ΡΡΠΈΡ ΡΡ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ°Π²Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π±ΡΠ΄ΡΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ Π² ΡΠΎΠΌ ΠΆΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π² ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅.
Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ
Π ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΈΠ· ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ Π½Π°Π±ΠΎΡΠ° - ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ, ΠΈΠ»ΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΡΠΎΡΡΡΠΌΠΈ Π²ΡΡΠ°Π²ΠΊΠ°ΠΌΠΈ (Insertion sort). ΠΡΠΎΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π·Π½Π°ΠΊΠΎΠΌΡΠΌ Π²ΡΠ΅ΠΌ, ΠΊΡΠΎ ΠΈΠ³ΡΠ°Π΅Ρ Π² ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΡΡΠΎΡΠ½ΡΠ΅ ΠΈΠ³ΡΡ, ΠΊΠ°ΠΊ Π²ΠΈΡΡ ΠΈΠ»ΠΈ Π±ΡΠΈΠ΄ΠΆ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ³ΡΠΎΠΊΠΎΠ² ΡΠΎΡΡΠΈΡΡΠ΅Ρ ΡΠ²ΠΎΠΈ ΠΊΠ°ΡΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ.
Π ΠΈΡΡΠ½ΠΎΠΊ 5.4. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ
ΠΠ°ΡΠΈΠ½Π°Π΅ΠΌ Ρ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΊΡΠ°Ρ ΠΊΠΎΠ»ΠΎΠ΄Ρ. Π‘ΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ Π΄Π²Π΅ ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΊΠ°ΡΡΡ ΠΈ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ ΠΈΡ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅. Π‘ΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΡΠ΅ΡΡΡ ΠΊΠ°ΡΡΡ. ΠΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π΅Π΅ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ΅ΡΠ²ΡΠΌ Π΄Π²ΡΠΌ ΠΊΠ°ΡΡΠ°ΠΌ. Π‘ΠΌΠΎΡΡΠΈΠΌ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΡΡΡ ΠΊΠ°ΡΡΡ ΠΈ Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ Π΅Π΅ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΡΠ΅ΠΌ ΠΊΠ°ΡΡΠ°ΠΌ. Π’Π΅ ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Ρ ΠΏΡΡΠΎΠΉ, ΡΠ΅ΡΡΠΎΠΉ, ΡΠ΅Π΄ΡΠΌΠΎΠΉ ΠΈ Π²ΡΠ΅ΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΊΠ°ΡΡΠ°ΠΌΠΈ. ΠΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ Π»Π΅Π²Π°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ»ΠΎΠ΄Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 5.7. Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ
procedure TDInsertionSortStd(aList : TList;
aFirst : integer;
aLast : integer;
aCompare : TtdCompareFunc);
var
i, j : integer;
Temp : pointer;
begin
TDValidateListRange(aList, aFirst, aLast, 'TDInsertionSortStd');
for i := succ(aFirst) to aLast do
begin
Temp := aList.List^[i];
j :=i;
while (j > aFirst) and (aCompare(Temp, aList.List^[j-1]) < 0) do
begin
aList.List^[j] := aList.List^[j-1];
dec(j);
end;
aList.List^[j] := Temp;
end;
end;
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ΄Π½Π° ΠΎΡΠ΅Π½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ: Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΠΈΡΠΊΠ΅ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π΅Π³ΠΎ Π²ΡΡΠ°Π²ΠΊΠΈ (Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ») ΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ, Π½Π° ΠΎΠ΄Π½Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π²ΠΏΡΠ°Π²ΠΎ, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ, ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Ρ "Π΄ΡΡΡ" Π² ΡΠΏΠΈΡΠΊΠ΅ Π²Π»Π΅Π²ΠΎ. Π ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΠΌΡ Π½Π°Ρ ΠΎΠ΄ΠΈΠΌ Π½ΡΠΆΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ²ΡΠ΅Π΅ΡΡ ΠΌΠ΅ΡΡΠΎ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠΈΠΊΠ». ΠΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΠΉ: Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠΎ Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°, Ρ.Π΅. ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π½ΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΠ΅Ρ ΡΠΆΠ΅ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΌΠ΅Π½ΡΡΠ΅Π΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΡΠΈΠΊΠ»Π°, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ ΡΡΠΎ ΠΎΠ½ΠΎ ΡΠΎΠ±Π»ΡΠ΄Π°Π΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠ΅Π΄ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΡΠΆΠ΅ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Π΅Ρ Π²ΡΡ ΠΎΠ΄ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΡΠΏΠΈΡΠΊΠ°. Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠΈΠ³Π½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠ΅Π½ΡΡΠ΅ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΠΏΠΈΡΠΊΠ΅. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π² ΠΎΠ±ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΏΠΈΡΠΊΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΠΈ, ΠΊΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² ΡΠΏΠΈΡΠΊΠ΅ Π½Π΅Ρ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°. (Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π² Π΄ΡΡΠ³ΠΎΠΉ, ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π½Π° ΠΎΠ΄ΠΈΠ½ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΡΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ ΡΠ°Π²Π½ΡΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΡΠΎΡΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΡΠ»Π΅ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ. Π Π²ΡΠ΅ ΡΡΠΎ ΡΠ°Π΄ΠΈ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΊΠ»ΡΡΠΈΡΡ ΠΎΠ΄Π½Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ. ΠΠ΅Ρ ΡΠΆ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ.)
Π ΠΈΡΡΠ½ΠΎΠΊ 5.5. Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ: ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ, Π½Π°ΠΉΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ (ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Π‘ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠ±ΠΎΡΠ°). Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Π²ΡΡΠ°Π²ΠΎΠΊ ΠΈ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΡ ΠΎΠ΄Π° Π·Π° Π½Π°ΡΠ°Π»ΠΎ ΡΠΏΠΈΡΠΊΠ°.
ΠΠΈΡΡΠΈΠ½Π³ 5.8. ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ
procedure TDInsertionSort(aList : TList;
aFirst : integer;
aLast : integer;
aCompare : TtdCompareFunc);
var
i, j : integer;
IndexOfMin : integer;
Temp : pointer;
begin
TDValidateListRange(aList, aFirst, aLast, 'TDInsertionSort');
{Π½Π°ΠΉΡΠΈ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ Π΅Π³ΠΎ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ}
IndexOfMin := aFirst;
for i := succ(aFirst) to aLast do
if (aCompare(aList.List^[i], aList.List^[IndexOfMin]) < 0) then
IndexOfMin := i;
if (aFirst <> indexOfMin) then begin
Temp := aList.List^[aFirst];
aList.List^[aFirst] := aList.List^[IndexOfMin];
aList.List^ [IndexOfMin] := Teufend;
{ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΡΠΎΡΡΡΡ Π²ΡΡΠ°Π²ΠΎΠΊ}
for i := aFirst+2 to aLast do
begin
Temp := aList.List^[i];
j := i;
while (aCompare(Temp, aList.List^[j-1]) < 0) do
begin
aList.List^[j] := aList.List^[j-1];
dec(j);
end;
aList.List^[j] := Temp;
end;
end;
Π₯ΠΎΡΠΈΡΠ΅ Π²Π΅ΡΡΡΠ΅, Ρ ΠΎΡΠΈΡΠ΅ Π½Π΅Ρ, Π½ΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΡ ΠΎΠ΄Π° Π·Π° Π³ΡΠ°Π½ΠΈΡΡ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠΈ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π°Π»Π° ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π±ΡΡΡΡΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π½Π° 7%.
ΠΠ°ΠΊ ΠΈ ΡΡΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½Π½ΡΠ΅ Π½Π°ΠΌΠΈ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ°, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ ΠΊ ΠΊΠ»Π°ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² O(n(^2^)). ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΏΡΠ·ΡΡΡΠΊΠΎΠ²ΠΎΠΉ, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΎΠΉ, Π΅ΡΠ»ΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠΆΠ΅ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½, ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΏΠ°Ρ Π΄Π²ΡΡ ΡΠΎΡΠ΅Π΄Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π₯ΡΠ΄ΡΠΈΠΌ ΡΠ»ΡΡΠ°Π΅ΠΌ Π΄Π»Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΡΠ°Π²ΠΎΠΊ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π½ Π² ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ (ΠΊΠ°ΠΊ ΠΈ Π΄Π»Ρ ΠΏΡΠ·ΡΡΡΠΊΠΎΠ²ΠΎΠΉ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ) - Π΄Π»Ρ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΉΡΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅.