Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 35

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ снова ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΎΠ΄Ρƒ справа Π½Π°Π»Π΅Π²ΠΎ Π΄ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π΄Π²ΠΎΠΉΠΊΠ°. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ направлСния ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ² Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ отсортирована вся ΠΊΠΎΠ»ΠΎΠ΄Π°.

Листинг 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^)). Как ΠΈ Π² случаС с ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ, сортировкой, Ссли исходный список ΡƒΠΆΠ΅ отсортирован, сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок практичСски Π½Π΅ выполняСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… дСйствий ΠΏΠΎΠΌΠΈΠΌΠΎ сравнСния ΠΏΠ°Ρ€ Π΄Π²ΡƒΡ… сосСдних элСмСнтов. Π₯ΡƒΠ΄ΡˆΠΈΠΌ случаСм для сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок являСтся ситуация, ΠΊΠΎΠ³Π΄Π° исходный список отсортирован Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС (ΠΊΠ°ΠΊ ΠΈ для ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ сортировки) - для попадания Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ мСсто ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ элСмСнту Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ максимальноС расстояниС.