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

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

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

h := 1;

Ninth := (aLast - aFirst) div 9;

while (h<= Ninth) do h := (h * 3) + 1;

{Π½Π°Ρ‡Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ h Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒ}

while (h > 0) do

begin

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставки для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ подмноТСства}

for i := (aFirst + h) to aLast do

begin

Temp := aList.List^[i];

j := i;

while (j >= (aFirst+h)) and

(aCompare(Temp, aList.List^[j-h]) < 0) do

begin

aList.List^[j] := aList.List^[j-h];

dec(j, h);

end;

aList.List^[j ] := Teilend;

{ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ h Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒ}

h := h div 3;

end;

end;


ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ зависимости для Π°Π½Π°Π»ΠΈΠ·Π° быстродСйствия сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π° достаточно слоТны. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС для ΠΎΡ†Π΅Π½ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния сортировки ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… значСниях h приходится ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ статистичСскими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π°Π½Π°Π»ΠΈΠ· быстродСйствия Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π¨Π΅Π»Π»Π° практичСски Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ быстрыС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹.

Π§Ρ‚ΠΎ касаСтся устойчивости, Ρ‚ΠΎ ΠΏΡ€ΠΈ пСрСстановкС элСмСнтов, Π΄Π°Π»Π΅ΠΊΠΎ отстоящих Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ порядка слСдования элСмСнтов с Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ значСниями. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π° относится ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ нСустойчивых Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» Π±ΡƒΠ΄Π΅Ρ‚ посвящСн Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ странному Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ сортировки -сортировкС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания (comb sort). Он Π½Π΅ относится ΠΊ стандартным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ. На сСгодняшний дСнь ΠΎΠ½ малоизвСстСн ΠΈ поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π΄Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΎΠ½ отличаСтся достаточно высоким ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ быстродСйствия ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ. ΠœΠ΅Ρ‚ΠΎΠ΄ Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ Π‘Ρ‚Π΅Ρ„Π°Π½ΠΎΠΌ ЛСйси (Stephan Lacey) ΠΈ Π ΠΈΡ‡Π°Ρ€Π΄ΠΎΠΌ Боксом (Richard Box) ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ "Byte" Π² Π°ΠΏΡ€Π΅Π»Π΅ 1991 Π³ΠΎΠ΄Π°. ЀактичСски ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΡƒΡŽ сортировку Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сортировку ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок.

ΠŸΠ΅Ρ€Π΅Ρ‚Π°ΡΡƒΠΉΡ‚Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ снова Ρ€Π°Π·Π»ΠΎΠΆΠΈΡ‚Π΅ ΠΈΡ… Π½Π° столС. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈ Π΄Π΅Π²ΡΡ‚ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ. Если ΠΎΠ½ΠΈ находятся Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС, помСняйтС ΠΈΡ… мСстами. Π’Ρ‹Π΄Π΅Π»ΠΈΡ‚Π΅ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΈ Π΄Π΅ΡΡΡ‚ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ, ΠΏΡ€ΠΈ нСобходимости, помСняйтС ΠΈΡ… мСстами. Π’ΠΎ ΠΆΠ΅ самоС ΠΏΡ€ΠΎΠ΄Π΅Π»Π°ΠΉΡ‚Π΅ для Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΈ ΠΎΠ΄ΠΈΠ½Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹, Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΉ ΠΈ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ, Π° Π·Π°Ρ‚Π΅ΠΌ пятой ΠΈ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ. Π”Π°Π»Π΅Π΅ сравнивайтС ΠΈ пСрСставляйтС ΠΏΠ°Ρ€Ρ‹ ΠΊΠ°Ρ€Ρ‚ (1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12) ΠΈ (7, 13) (Ρ‚.Π΅. ΠΊΠ°Ρ€Ρ‚Ρ‹, отстоящиС Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π½Π° ΡˆΠ΅ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ). А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ ΠΊΠΎΠ»ΠΎΠ΄Π΅ для ΠΊΠ°Ρ€Ρ‚, отстоящих Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π½Π° Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ Π½Π° Ρ‚Ρ€ΠΈ ΠΈ Π΄Π²Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ПослС этого Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΡƒΡŽ сортировку (ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° для сосСдних ΠΊΠ°Ρ€Ρ‚).

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°Ρ€Ρ‚Ρ‹ большими "ΠΏΡ€Ρ‹ΠΆΠΊΠ°ΠΌΠΈ" ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ. Как ΠΈ сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π°, прочСсываниС Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π° ΠΊΠ°Ρ€Ρ‚Π°Ρ…, Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания трСбуСтся всСго Π΄Π²Π° Ρ†ΠΈΠΊΠ»Π° - ΠΎΠ΄ΠΈΠ½ для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° "ΠΏΡ€Ρ‹ΠΆΠΊΠΎΠ²", Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ - для выполнСния разновидности ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ сортировки.

Как Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ значСния расстояний 8, 6, 4, 3, 2, 1? Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сортировки ΠΏΡ€ΠΎΠ²Π΅Π»ΠΈ большоС количСство экспСримСнтов ΠΈ эмпиричСским ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ расстояния "ΠΏΡ€Ρ‹ΠΆΠΊΠ°" Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ дСлСния ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Π½Π° 1.3. Π­Ρ‚ΠΎΡ‚ "коэффициСнт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ" Π±Ρ‹Π» Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΈΠ· рассмотрСнных ΠΈ позволял ΡΠ±Π°Π»Π°Π½ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΎΡ‚ Π΄Π»ΠΈΠ½Ρ‹ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ расстояний ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ сортировки.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, создатСли Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΈΡˆΠ»ΠΈ ΠΊ Π½Π΅ΠΎΠ±ΡŠΡΡΠ½ΠΈΠΌΠΎΠΌΡƒ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ значСния расстояний ΠΌΠ΅ΠΆΠ΄Ρƒ сравниваСмыми элСмСнтами 9 ΠΈ 10 ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‚.Π΅. Ссли Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ расстояний присутствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 9 ΠΈΠ»ΠΈ 10, Π΅Π³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π° 11. Π’ этом случаС сортировка Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ быстрСС. ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ экспСримСнты ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‚ этот Π²Ρ‹Π²ΠΎΠ΄. ВСорСтичСских исслСдований сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания Π½Π° сСгодняшний дСнь Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ, ΠΈ поэтому Π½Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ объяснСния, ΠΏΠΎΡ‡Π΅ΠΌΡƒ привСдСнная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ расстояний являСтся ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ.


Рисунок 5.7. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания (ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ пСрСстановки)


Листинг 5.10. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания


procedure TDCombSort(aList : TList;

aFirst : integer; aLast : integer;

aCompare : TtdCompareFunc);

var

i, j : integer;

Temp : pointer;

Done : boolean;

Gap : integer;

begin

TDValidateListRange(aList, aFirst, aLast, 'TDCombSort');

{Π½Π°Ρ‡Π°Ρ‚ΡŒ с расстояния, Ρ€Π°Π²Π½ΠΎΠ³ΠΎ количСству элСмСнтов}

Gap := succ(aLast - aFirst);

repeat

{ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сортировка Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π½Π° этом ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅}

Done := true;

{calculate the new gap}

Gap := (longint(Gap) * 10) div 13;

{Gap := Trunc(Gap / 1.3);}

if (Gap < 1) then

Gap := 1

else

if (Gap = 9) or (Gap = 10) then

Gap := 11;

{ΡƒΠΏΠΎΡ€ΡΠ΄ΠΎΡ‡ΠΈΡ‚ΡŒ Π΄Π²Π° элСмСнта, отстоящих Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π½Π° Gap элСмСнтов}

for i := aFirst to (aLast - Gap) do

begin

j := i + Gap;

if (aCompare(aList.List^[j], aList.List^[i]) < 0) then begin

{ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами элСмСнты с индСксами j ΠΈ (j-Gap)}

Temp := aList.List^[j];

aList.List^[j] := aList.List^[i];

aList.List^[i] := Temp;

{Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° пСрСстановка, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, сортировка Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°}

Done := false;

end;

end;

until Done and (Gap = 1);

end;


Π’ экспСримСнтах, ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠ½ΠΈΠ³ΠΈ, сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания Π±Ρ‹Π»Π° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ быстрСС сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π° (Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠšΠ½ΡƒΡ‚Π°). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΅Π΅ Π»Π΅Π³Ρ‡Π΅ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Ссли Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ нСобходимости ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ расстояний 9 ΠΈ 10). ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ прочСсывания, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π¨Π΅Π»Π»Π°, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ нСустойчивых Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Π‘Π°ΠΌΡ‹Π΅ быстрыС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки

И Π²ΠΎΡ‚, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ Π΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π΄ΠΎ самых быстрых Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сортировки. Они ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΡ… особСнности, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… прилоТСниях.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° слияниСм

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° слияниСм (merge sort) считаСтся вСсьма интСрСсным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ. Она ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Π° своСй простотой ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Π°ΠΆΠ½Ρ‹Ρ… особСнностСй (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ класса O(n log(w)) ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ…ΡƒΠ΄ΡˆΠΈΡ… случаСв), Π½ΠΎ Ссли ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ Π½Π° Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, сортировка слияниСм ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ нСобходимости сортировки содСрТимого Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слишком Π²Π΅Π»ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² памяти.

ΠœΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ сортировку слияниСм ΠΏΠΎ шагам, начиная со слияния. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ опишСм, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ для выполнСния сортировки. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ - Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΈ Π±Π΅Π· ΠΊΠ°Ρ€Ρ‚.

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ имССтся Π΄Π²Π° ΡƒΠΆΠ΅ отсортированных списка ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ список, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΠΈΠΉ всС элСмСнты исходных списков. План А состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π° списка Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ сортировку. Но Π² этом случаС, ΠΊ соТалСнию, ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ исходныС списки ΡƒΠΆΠ΅ отсортированы. План Π‘ прСдусматриваСт слияниС. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты Π² ΠΎΠ±ΠΎΠΈΡ… списках. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ с мСньшим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ пСрСносим Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список. Π‘Π½ΠΎΠ²Π° смотрим Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ элСмСнты Π² ΠΎΠ±ΠΎΠΈΡ… списках ΠΈ снова пСрСносим Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список элСмСнт с мСньшим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, удаляя Π΅Π³ΠΎ ΠΈΠ· исходного списка. ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ процСсс продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΡΡ‡Π΅Ρ€ΠΏΠ°ΡŽΡ‚ΡΡ элСмСнты ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· списков. ПослС этого Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список ΠΌΠΎΠΆΠ½ΠΎ пСрСнСсти всС ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π² исходном спискС элСмСнты. Π’Π°ΠΊΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ извСстСн ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π΄Π²ΡƒΡ…ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ слияния (two-way merge algorithm ).

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ элСмСнты Π½Π΅ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· исходных списков. ВмСсто удалСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ элСмСнты списков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт.

Листинг 5.11. БлияниС Π΄Π²ΡƒΡ… отсортированных массивов TList


procedure TDListMerge( aList 1, aList2, aTarget List : TList;

aCompare : TtdCompareFunc);

var

Inx1, Inx2, Inx3 : integer;

begin

{ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список}

aTargetList.Clear;

aTargetList.Capacity := aList1.Count + aList2.Count;

{ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ счСтчики}

Inx1 := 0;

Inx2 := 0;

Inx3 := 0;

{Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ» Π΄ΠΎ исчСрпания элСмСнтов ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· списка...}

while (Inx1 < aList1.Count) and (Inx2 < aList2.Count) do

begin

{ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ наимСньшСС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Π΄Π²ΡƒΡ… списков ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список; ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ значСния индСксов Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ}

if aCompare (aList1.List^[Inx1], aList2.List^[Inx]) < = 0 then begin

aTargetList.List^[Inx3] := aList1.List^[Inx1];

inc(Inx1);

end

else begin

aTargetList.List^[Inx3] := aList2.List^[Inx2];

inc(Inx2);

end;

inc(Inx3);

end;

{Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Π° прСкращаСтся ΠΏΡ€ΠΈ исчСрпании элСмСнтов ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· списков; Ссли Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ спискС Π΅Ρ‰Π΅ ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ элСмСнты, ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список}

if (Inx1 < aList1.Count) then

Move(aList1.List^[Inx1], aTargetList.List^[Inx3],

(aList1.Count - Inx1) * sizeof(pointer)) {Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС элСмСнты, ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ спискС, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список}

else

Move(aList2.List^[Inx2], aTargetList.List^[Inx3], (aList2.Count - Inx2) * sizeof(pointer));

end;


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π²ΡˆΠΈΡ…ΡΡ элСмСнтов Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌ спискС выполняСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Move. Для копирования ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСбольшой Ρ†ΠΈΠΊΠ», ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Move Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ быстрСС.