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

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

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

Листинг 5.13. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ сортировка слияниСм


const

MSCutOff = 16;


procedure MSInsertionSort(aList : TList;

aFirst : integer; aLast : integer;

aCompare : TtdCompareFunc);

var

i, j : integer;

IndexOfMin : integer;

Temp : pointer;

begin

{Π½Π°ΠΉΡ‚ΠΈ наимСньший элСмСнт Π² спискС}

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] := Temp;

end;

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок}

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;


procedure MS(aList : TList; aFirst : integer; aLast : integer;

aCompare : TtdCompareFunc;

aTempList : PPointerList);

var

Mid : integer;

is j : integer;

ToInx : integer;

FirstCount : integer;

begin

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

Mid := (aFirst + aLast) div 2;

{Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ списка с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ сортировки слияниСм ΠΈΠ»ΠΈ Ссли количСство элСмСнтов достаточно ΠΌΠ°Π»ΠΎ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ сортировки ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок}

if (aFirst < Mid) then

if (Mid-aFirst) <= MSCutOff then

MSInsertionSort(aList, aFirst, Mid, aCompare) else

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

{Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹}

if (suce(Mid) < aLast) then

if (aLast-succ(Mid) ) <= MSCutOf f then

MSInsertionSort(aList, succ(Mid), aLast, aCompare)

else

MS (aList, suce(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 TDMergeSort(aList : TList;

aFirst : integer;

aLast : integer;

aCompare : TtdCompareFunc);

var

TempList : PPointerList;

ItemCount: integer;

begin

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

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

if (aFirst < aLast) then begin

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

ItemCount := suce (aLast - aFirst);

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

try

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

finally

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

end;

end;

end;


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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ для сортировки ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΡ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π² спискС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ сортировка ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ вставок, которая сама ΠΏΠΎ сСбС являСтся устойчивой, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ оптимизированная сортировка слияниСм Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ Π³Ρ€ΡƒΠΏΠΏΠ΅ устойчивых Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

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

Π’ ΠΊΠΎΠ½Ρ†Π΅ этой Π³Π»Π°Π²Ρ‹ ΠΌΡ‹ рассмотрим случай, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ сортировка слияниСм просто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°, - сортировка связного списка.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, сортировка слияниСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для сортировки содСрТимого Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слишком Π²Π΅Π»ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΡΡ Π² памяти. Π’ этой ситуации выполняСтся сортировка частСй Ρ„Π°ΠΉΠ»ΠΎΠ², запись этих частСй Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡ… слияниС Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ».

Быстрая сортировка

И послСдний Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π² этой Π³Π»Π°Π²Π΅ - быстрая сортировка (quicksort). (Π’ ΠΊΠ½ΠΈΠ³Π΅ ΠΌΡ‹ опишСм Π΅Ρ‰Π΅ ΠΎΠ΄Π½Ρƒ сортировку "Π² памяти" - ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΡƒΡŽ сортировку, Π½ΠΎ ΠΎΠ½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Π½ΠΈΠΉ структуры Π΄Π°Π½Π½Ρ‹Ρ… - Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ рассмотрСниС ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄Π°Π»ΡŒΠ½ΠΎΠΉ сортировки ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄ΠΎ Π³Π»Π°Π²Ρ‹ 9.)

Алгоритм быстрой сортировки Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ К.A.Π . Π₯ΠΎΠ°Ρ€ΠΎΠΌ (C.A.R. Hoare) Π² 1960 Π³ΠΎΠ΄Ρƒ. Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ извСстСн, Ρ‡Π΅ΠΌ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка. Π’ настоящСС врСмя ΠΎΠ½ являСтся самым ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ сортировки, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ Π΅Π³ΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ характСристиками: это Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ класса O(n log(n)) для ΠΎΠ±Ρ‰Π΅Π³ΠΎ случая, ΠΎΠ½ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ лишь Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ объСма Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… списков ΠΈ достаточно ΡƒΠ΄ΠΎΠ±Π΅Π½ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Но, ΠΊ соТалСнию, быстрая сортировка ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ нСсколько Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… характСристик: ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ допускаСтся ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ошибок (простыС ошибки Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ), быстродСйствиС Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС составляСт O(n(^2^)) ΠΈ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΠΎΠ½Π° нСустойчива.

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

Быстрая сортировка встрСчаСтся Π²Π΅Π·Π΄Π΅. Π’ΠΎ всСх вСрсиях Delphi, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ вСрсии 1, ΠΌΠ΅Ρ‚ΠΎΠ΄ TList.Sort Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° основС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° быстрой сортировки. ΠœΠ΅Ρ‚ΠΎΠ΄ TStringList.Sort Π²ΠΎ всСх вСрсиях Delphi Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ быстрой сортировки. Π’ Π‘++ функция qsort ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π½Π° Π±Π°Π·Π΅ быстрой сортировки.

Основной Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ быстрой сортировки, ΠΊΠ°ΠΊ ΠΈ сортировку слияниСм, ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΠΊ классу "раздСляй ΠΈ властвуй". Он Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚ исходный список Π½Π° Π΄Π²Π°, Π° Π·Π°Ρ‚Π΅ΠΌ для выполнСния сортировки рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ сам сСбя для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ части списка. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² быстрой сортировкС Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π΅Π»ΠΈΡ‚ΡŒ процСссу раздСлСния. Π’ Ρ€Π°Π·Π±ΠΈΡ‚ΠΎΠΌ спискС происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: выбираСтся элСмСнт, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ, ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ элСмСнты Π² спискС. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… мСньшС, Ρ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта, пСрСносятся Π»Π΅Π²Π΅Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ, Π° элСмСнты, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС, Ρ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта, пСрСносятся ΠΏΡ€Π°Π²Π΅Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ. ПослС этого ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ элСмСнт находится Π½Π° своСм мСстС Π² отсортированном спискС. Π—Π°Ρ‚Π΅ΠΌ выполняСтся рСкурсивный Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ быстрой сортировки для Π»Π΅Π²ΠΎΠΉ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ частСй списка (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ элСмСнта). РСкурсивныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° список, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки, Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ элСмСнт, Π°, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, вСсь список оказываСтся отсортированным.