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

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

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

ВрСмя выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π΄Π²ΡƒΡ…ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ слияния зависит ΠΎΡ‚ количСства элСмСнтов Π² ΠΎΠ±ΠΎΠΈΡ… исходных списках. Если Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΈΠ· Π½ΠΈΡ… находится n элСмСнтов, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ - m, Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ (n + m) сравнСний. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Π²ΡƒΡ…ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ слияния ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу O(n).

Каким ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π΄Π²ΡƒΡ…ΠΏΡƒΡ‚Π΅Π²ΠΎΠ³ΠΎ слияния ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку? Для Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° отсортированных списка мСньшСй Π΄Π»ΠΈΠ½Ρ‹, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… создаСтся ΠΎΠ΄ΠΈΠ½ больший список. На основС Ρ‚Π°ΠΊΠΎΠ³ΠΎ описания ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΊ рСкурсивному ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ сортировки слияниСм: Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ исходный список Π½Π° Π΄Π²Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки слияниСм, Π° Π·Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° слияния ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚Π΅ подсписки Π² ΠΎΠ΄ΠΈΠ½ отсортированный список. РСкурсия заканчиваСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ΄-ΠΏΠΎΠ΄-подсписок, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ сортировки, содСрТит всСго ΠΎΠ΄ΠΈΠ½ элСмСнт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, являСтся отсортированным.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° слияниСм ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ нСдостатком - Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ слияния Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ списка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ слияния.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ всСх Ρ€Π°Π½Π΅Π΅ рассмотрСнных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сортировки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ элСмСнты нСпосрСдствСнно Π² самом исходном спискС, сортировка слияниСм для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ большого Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ объСма памяти. Π’ качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ приблиТСния Π² самой простой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ для выполнСния сортировки ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π΅Π½ суммС Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π΄Π²ΡƒΡ… исходных списков. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ· ΠΎΠ±ΠΎΠΈΡ… списков Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список, Π° Π·Π°Ρ‚Π΅ΠΌ послС слияния - Π² основной список. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ слияния, Π½Π΅ трСбуя Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ списка, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ нСобходимости примСнСния сортировки слияниСм Π½ΡƒΠΆΠ½ΠΎ ΡΠΌΠΈΡ€ΠΈΡ‚ΡŒΡΡ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ трСбованиями Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ памяти.

Бколько ΠΆΠ΅ памяти потрСбуСтся? Волько Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ список, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ исходного списка, Π½ΠΎ Π·Π° счСт нСбольшой хитрости ΠΌΠΎΠΆΠ½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ трСбования ΠΏΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти Π΄ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° исходного списка.

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

Листинг 5.12. Бтандартная сортировка слияниСм


procedure MSS(aList : TList;

aFirst : integer;

aLast : integer;

aCoropare : TtdCompareFunc;

aTempList : PPointerList);

var

Mid : integer;

i, j : integer;

ToInx : integer;

FirstCount : integer;

begin

{Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΡΡ€Π΅Π΄Π½ΡŽΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ}

Mid := (aFirst + aLast) div 2;

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ сортировку слияниСм ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ списка}

if (aFirst < Mid) then

MSS(aList, aFirst, Mid, aCompare, aTempList);

if (suce(Mid) < aLast) then

MSS(aList, succ(Mid), aLast, aCompare, aTempList);

{ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ списка Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список}

FirstCount := suce(Mid - aFirst);

Move(aList.List^[aFirst], aTempList^[0], FirstCount * sizeof(pointer));

{ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния индСксов: i - индСкс для Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ списка (Ρ‚.Π΅. ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ списка), j - индСкс для Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ списка, ToInx - индСкс Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ спискС, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ отсортированныС элСмСнты}

i := 0;

j := suce (Mid);

ToInx := aFirst;

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ слияниС Π΄Π²ΡƒΡ… списков}

{ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· списков Π½Π΅ опустССт}

while (i < FirstCount) and (j <= aLast) do

begin

{ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ элСмСнт с наимСньшим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов Π² ΠΎΠ±ΠΎΠΈΡ… списках ΠΈ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ; ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ индСкса}

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

aList.List^[ToInx] := aTempList^[i];

inc( i );

end

else begin

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

inc(j);

end;

{Π² объСдинСнном спискС Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ элСмСнт}

inc(ToInx);

end;

{Ссли Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ спискС ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ элСмСнты, ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ…}

if (i < FirstCount) then

Move(aTempList^[i], aList.List^[ToInx], (FirstCount - i) * sizeof(pointer));

{Ссли Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ спискС ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ элСмСнты, Ρ‚ΠΎ ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ находятся Π² Π½ΡƒΠΆΠ½Ρ‹Ρ… позициях, Π·Π½Π°Ρ‡ΠΈΡ‚, сортировка Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ; Ссли Π²Ρ‚ΠΎΡ€ΠΎΠΉ список пуст, сортировка Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°}

end;


procedure TDMergeSortStd(aList : TList;

aFirst : integer;

aLast : integer;

aCompare : TtdCompareFunc);

var

TempList : PPointerList;

ItemCount: integer;

begin

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

{Ссли Π΅ΡΡ‚ΡŒ хотя Π±Ρ‹ Π΄Π²Π° элСмСнта для сортировки}

if (aFirst < aLast) then begin

{ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ список ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ}

ItemCount := suce(aLast - aFirst);

GetMem(TempList, (suce(ItemCount) div 2) * sizeof(pointer));

try

MSS(aList, aFirst, aLast, aCompare, TempList);

finally

FreeMem(TempList, (suce(ItemCount) div 2) * sizeof(pointer));

end;

end;

end;


Если Π²Ρ‹ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π² листингС 5.12, Ρ‚ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ содСрТит ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, TDMergeSortStd, которая вызываСтся для выполнСния сортировки списка, ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, MSS, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½ΡƒΡŽ сортировку. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° TDMergeSortStd провСряСт ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ индСкса Π² допустимыС ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ ΠΈ сам список, Π° Π·Π°Ρ‚Π΅ΠΌ - ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ Π² спискС хотя Π±Ρ‹ Π΄Π²Π° элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. ПослС этого создаСтся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ список ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ, достаточным для хранСния ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ количСства элСмСнтов исходного массива. Π”Π°Π»Π΅Π΅ вызываСтся рСкурсивная ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS.

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сама сСбя для сортировки ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ Π΅ΠΉ части массива. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ массив. Начиная с этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ΄ прСдставляСт собой ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ сортировки слияниСм, копируя Π΄Π²Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ списка Π² исходный список. Если послС выполнСния Ρ†ΠΈΠΊΠ»Π° сравнСния ΠΈ копирования Π²ΠΎ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ массивС ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ элСмСнты, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS ΠΈΡ… просто ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚. Если ΠΆΠ΅ элСмСнты ΠΎΡΡ‚Π°Π»ΠΈΡΡŒ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π΅ списка, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈ Π² стандартной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° слияния: ΠΎΠ½ΠΈ ΡƒΠΆΠ΅ находятся Π½Π° своих мСстах.

Π’Ρ‹Π²ΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ быстродСйствия сортировки слияниСм достаточно слоТСн. Для простоты Π΅Π΅ опрСдСлСния Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² исходном спискС находится 2(^Ρ…^) элСмСнтов. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ элСмСнтов 32. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ рСкурсии ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ Π½Π° этапС слияния Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 32 сравнСний. На Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ рСкурсии ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π΄Π²Π° Ρ€Π°Π·Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ количСство сравнСний ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Ρ‚ΡŒ 16. Π”Π°Π»Π΅Π΅ рассматриваСм Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ, Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, пятый ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ рСкурсии (ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ сортировка всСго Π΄Π²ΡƒΡ… элСмСнтов), Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ мСсто 16 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΏΠΎ Π΄Π²Π° сравнСния Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ‰Π΅Π΅ количСство сравнСний Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ 5 * 32. Но ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΏΡΡ‚ΡŒ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ рСкурсии, являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ постоянно Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ постСпСнно Π΄Π΅Π»ΠΈΠ»ΠΈ список Π½Π° Π΄Π²Π΅ Ρ€Π°Π²Π½Ρ‹Π΅ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹, Π° 2(^5^) = 32, Ρ‡Ρ‚ΠΎ, СстСствСнно ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ log(_2_)32 = 5. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π΅ утруТдая сСбя ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ рассмотрСнного Π½Π°ΠΌΠΈ частного случая ΠΊ ΠΎΠ±Ρ‰Π΅ΠΌΡƒ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ сортировка слияниСм ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ классу O(n log(n)) Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Π§Ρ‚ΠΎ касаСтся устойчивости, Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнты ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ слияния, ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ всСй сортировки слияниСм Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ устойчивости самого слияния Π΄Π²ΡƒΡ… ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½ списка. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли Π² ΠΎΠ±Π΅ΠΈΡ… ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ элСмСнты с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ сравнСния Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ список ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ элСмСнт ΠΈΠ· ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ списка. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ опСрация слияния сохраняСт ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ порядок элСмСнтов, ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, сортировка слияниСм Π±ΡƒΠ΄Π΅Ρ‚ устойчивой.

Если ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ MSS Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ для Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² ΠΎΠ½Π° вызываСтся ΠΎΡ‡Π΅Π½ΡŒ часто. НапримСр, Ссли Π² спискС содСрТится 32 элСмСнта, Ρ‚ΠΎ для списка ΠΈΠ· 32 элСмСнтов ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, для списка ΠΈΠ· 16 элСмСнтов - Π΄Π²Π°ΠΆΠ΄Ρ‹, Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π° для 8 элСмСнтов, восСмь Ρ€Π°Π· для 4 элСмСнтов ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ Ρ€Π°Π· для 2 элСмСнтов (список минимальной Π΄Π»ΠΈΠ½Ρ‹), Ρ‚.Π΅. всСго 31 Ρ€Π°Π·. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, особСнно Ссли ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ большая Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (29) приходится для списков Π΄Π»ΠΈΠ½ΠΎΠΉ восСмь ΠΈ ΠΌΠ΅Π½Π΅Π΅ элСмСнтов. Если Π±Ρ‹ исходный список содСрТал 1024 элСмСнта, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° MSS Π±Ρ‹Π»Π° Π±Ρ‹ Π²Ρ‹Π·Π²Π°Π½Π° 1023 Ρ€Π°Π·Π°, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… 896 Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π±Ρ‹ Π½Π° долю списков Π΄Π»ΠΈΠ½ΠΎΠΉ восСмь ΠΈ ΠΌΠ΅Π½Π΅Π΅ элСмСнтов. ΠŸΡ€ΠΎΡΡ‚ΠΎ уТасно! ЀактичСски, для сортировки ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… списков Π±Ρ‹Π»ΠΎ Π±Ρ‹ эффСктивнСС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСрСкурсивный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ всСй сортировки. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ простой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π΄Π°Π»ΠΎ Π±Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ элСмСнтов ΠΌΠ΅ΠΆΠ΄Ρƒ основным ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ списком. И ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π»ΡƒΡ‡ΡˆΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для ускорСния сортировки слияниСм являСтся сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок.