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

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

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

Π‘ описанным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ связана Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Если Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ тасованиС с Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π³Π»Π°Π²Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· n элСмСнтов. ПослС этого для Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ останСтся Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· n - 1 элСмСнтов. Π”Π°Π»Π΅Π΅ для Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ элСмСнтов Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΆΠ΅ n - 2 ΠΈ Ρ‚.Π΄. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Π°ΠΊΠΈΡ… рассуТдСний ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ количСство Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ n! (n! ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ n Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ°Π» ΠΈ сводится ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡŽ n * (n- 1) * (n-2) *...* 1.)

ВСрнСмся ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅: Ссли Π½Π΅ Π±Ρ€Π°Ρ‚ΡŒ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ случай, ΠΊΠΎΠ³Π΄Π° n = 1, n(^n^) большС, Π° часто Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большС, Ρ‡Π΅ΠΌ n! Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ описанного Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Ρ‡Π°Ρ‰Π΅, Π½Π΅ΠΆΠ΅Π»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ n(^n^) Π½Π΅ дСлится Π½Π° n! Π±Π΅Π· остатка.

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

Листинг 5.3. ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ тасования массива TList


procedure TDListShuffle(aList : TList; aStart, aEnd : integer);

var

Range : integer;

Inx : integer;

RandomInx : integer;

TempPtr : pointer;

begin

TDValidateListRange(aList, aStart, aEnd, 'TDListShuffle');

{для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта, считая справа...}

for Inx := (aEnd - aStart) downto aStart + 1 do

begin

{ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ случайноС число ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ aStart Π΄ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ индСкса}

RandomInx := aStart + Random(Inx-aStart+ 1);

{Ссли случайный индСкс Π½Π΅ Ρ€Π°Π²Π΅Π½ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ, ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнты}

if (RandomInx <> Inx) then begin

TempPtr := aList.List^[Inx];

aList.List^[Inx] := aList.List^[RandomInx];

aList.List^ [RandomInx] TempPtr;

end;

end;

end;


ΠžΡΠ½ΠΎΠ²Ρ‹ сортировки

Алгоритмы сортировки ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: устойчивыС ΠΈ нСустойчивыС. К устойчивой сортировкС относятся Ρ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π² Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π²Π½Ρ‹Ρ… элСмСнтов Π² отсортированном Π½Π°Π±ΠΎΡ€Π΅ ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΡ… Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ эти элСмСнты Π±Ρ‹Π»ΠΈ Π² исходном Π½Π°Π±ΠΎΡ€Π΅. НапримСр, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π°Π±ΠΎΡ€Π΅ имССтся Ρ‚Ρ€ΠΈ элСмСнта ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта Ρ€Π°Π²Π½ΠΎ 42 (Ρ‚.Π΅. элСмСнты Ρ€Π°Π²Π½Ρ‹). ΠŸΡƒΡΡ‚ΡŒ Π² исходном Π½Π°Π±ΠΎΡ€Π΅ элСмСнт А находится Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 12, элСмСнт Π’ - Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 234, Π° Π‘ - Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ 3456. ПослС выполнСния устойчивой сортировки ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ А, Π’, Π‘, Ρ‚.Π΅. ΠΈΡ… Π²Π·Π°ΠΈΠΌΠ½Ρ‹ΠΉ порядок Π½Π΅ измСнится. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, нСустойчивая сортировка Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ элСмСнты с Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ значСниями Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Для нашСго ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° элСмСнты А, Π’ ΠΈ Π‘ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ А, Π’, Π‘, ΠΈΠ»ΠΈ Π‘, Π’, А, ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ сортировки Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния. Устойчивая сортировка Π±Ρ‹Π²Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π°ΠΌ Π½Π΅Ρ‡Π΅Π³ΠΎ бСспокоится ΠΎΠ± устойчивости.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сортировки с Ρ†Π΅Π»ΡŒΡŽ упрощСния понимания Π±ΡƒΠ΄Π΅Ρ‚ описан Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ сортировки ΠΊΠΎΠ»ΠΎΠ΄Ρ‹ ΠΊΠ°Ρ€Ρ‚. Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ всС Ρ‡Π΅Ρ€Π²ΠΈ ΠΈΠ· ΠΊΠΎΠ»ΠΎΠ΄Ρ‹ ΠΈ пСрСтасуйтС ΠΈΡ… (ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 13 ΠΊΠ°Ρ€Ρ‚Π°ΠΌΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Ρ€Π°Π±ΠΎΡ‚Ρƒ).

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

ΠœΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ всС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки, раздСляя ΠΈΡ… Π½Π° Ρ‚Ρ€ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹. К ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ отнСсСм ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΠ΅ ΠΊ классу O(n(^2^)), хотя ΠΏΠ°Ρ€ΠΎΡ‡ΠΊΠ° ΠΈΠ· Π½ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуациях Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… распрСдСлСниях Π΄Π°Π½Π½Ρ‹Ρ… Π΄Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ высокиС ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‚ΡΡ всС программисты ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ Π°Π·ΠΎΠ² программирования, - это ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка (bubble sort). Как это Π½ΠΈ прискорбно, Π½ΠΎ ΠΈΠ· всСх извСстных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка являСтся самой ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ. Π₯отя, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅Π΅ Π»Π΅Π³Ρ‡Π΅ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Π΅ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сортировки (хотя ΠΈ Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ).


Рисунок 5.1. Один ΠΏΡ€ΠΎΡ…ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ сортировки


ΠŸΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Π Π°Π·Π»ΠΎΠΆΠΈΡ‚Π΅ ваши ΠΊΠ°Ρ€Ρ‚Ρ‹ (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΈΡ… всСго 13?). ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΡƒΡŽ ΠΈ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ. Если двСнадцатая ΠΊΠ°Ρ€Ρ‚Π° ΡΡ‚Π°Ρ€ΡˆΠ΅ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ, помСняйтС ΠΈΡ… мСстами. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ ΠΊ ΠΎΠ΄ΠΈΠ½Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ ΠΈ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Π°ΠΌ. Если одиннадцатая ΠΊΠ°Ρ€Ρ‚Π° ΡΡ‚Π°Ρ€ΡˆΠ΅ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ, помСняйтС ΠΈΡ… мСстами. Π’ΠΎ ΠΆΠ΅ сдСлайтС ΠΈ для ΠΏΠ°Ρ€ (10, 11), (9, 10) ΠΈ Ρ‚.Π΄., ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠΉΠ΄Π΅Ρ‚Π΅ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹. ПослС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ всСй ΠΊΠΎΠ»ΠΎΠ΄Π΅ Ρ‚ΡƒΠ· окаТСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. ЀактичСски ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ "Π·Π°Ρ†Π΅ΠΏΠΈΠ»ΠΈΡΡŒ" Π·Π° Ρ‚ΡƒΠ· ΠΎΠ½ "Π²Ρ‹ΠΏΠ»Ρ‹Π»" Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΊ Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ ΠΈ Ρ‚Ρ€ΠΈΠ½Π°Π΄Ρ†Π°Ρ‚ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Π°ΠΌ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ описанный Π²Ρ‹ΡˆΠ΅ процСсс, Π½Π° этот Ρ€Π°Π· ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΡΡŒ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΊΠ°Ρ€Ρ‚Π°Ρ…. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΉΠΊΡƒ Π½Π° Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ процСсс сортировки, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Ρ с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π½ΠΎΠ²Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ количСство просматриваСмых ΠΊΠ°Ρ€Ρ‚ ΠΈ поступая Ρ‚Π°ΠΊ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° вся ΠΊΠΎΠ»ΠΎΠ΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ отсортирована.

ПолагаСм, Π²Ρ‹ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚Π΅ΡΡŒ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ сортировка Π±Ρ‹Π»Π° довольно-Ρ‚Π°ΠΊΠΈ ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. ΠŸΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° языкС Pascal "ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ" выраТаСтся ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, сущСствуСт ΠΎΠ΄ΠΈΠ½ простой ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²ΠΎΠΉ сортировки: Ссли ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ пСрСстановки, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΊΠ°Ρ€Ρ‚Ρ‹ ΡƒΠΆΠ΅ отсортированы Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΌ порядкС.

Листинг 5.4. ΠŸΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка


procedure TDBubbleSort(aList : TList;

aFirst : integer;

aLast : integer;

aCompare : TtdCompareFunc);

var

i, j : integer;

Temp : pointer;

Done : boolean;

begin

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

for i := aFirst to pred(aLast) do

begin

Done := true;

for j := aLast downto succ ( i ) do

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

{ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ j-Ρ‹ΠΉ ΠΈ (j - 1)-Ρ‹ΠΉ элСмСнты}

Temp := aList.List^ [ j ];

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

aList.List^[j-1] :=Temp;

Done := false;

end;

if Done then

Exit;

end;

end;


ΠŸΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌ класса O(n(^2^)). Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Ρ†ΠΈΠΊΠ»Π°: внСшний ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ, ΠΏΡ€ΠΈ этом количСство Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π° зависит ΠΎΡ‚ количСства элСмСнтов Π² массивС. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΎ n - 1 сравнСний, ΠΏΡ€ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΌ β€” n - 2, ΠΏΡ€ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ β€” n - 3 ΠΈ Ρ‚.Π΄. ВсСго Π±ΡƒΠ΄Π΅Ρ‚ n - 1 Ρ‚Π°ΠΊΠΈΡ… Ρ†ΠΈΠΊΠ»ΠΎΠ², Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ±Ρ‰Π΅Π΅ количСство сравнСний составит:

(n-1) + (n-2)+... + 1

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΡƒΡŽ сумму ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π΄ΠΎ n (n - 1)/2 ΠΈΠ»ΠΈ (n(^2^) - n)/2. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ O(n(^2^)). ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ пСрСстановок Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ нСсколько слоТнСС, Π½ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС (ΠΊΠΎΠ³Π΄Π° элСмСнты Π² исходном Π½Π°Π±ΠΎΡ€Π΅ Π±Ρ‹Π»ΠΈ отсортированы Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС) количСство пСрСстановок Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΠΎ количСству сравнСний, Ρ‚.Π΅. снова ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ O(n(^2^)).

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

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

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

Π¨Π΅ΠΉΠΊΠ΅Ρ€-сортировка

ΠŸΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠ²Π°Ρ сортировка ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΌΠ°Π»ΠΎΠΈΠ·Π²Π΅ΡΡ‚Π½ΡƒΡŽ Π²Π°Ρ€ΠΈΠ°Ρ†ΠΈΡŽ, которая Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π΄Π°Π΅Ρ‚ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ скорости, - это Ρ‚Π°ΠΊ называСмая ΡˆΠ΅ΠΉΠΊΠ΅Ρ€-сортировка (shaker sort).


Рисунок 5.2. Π”Π²Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡˆΠ΅ΠΉΠΊΠ΅Ρ€-сортировки


ВСрнСмся ΠΊ ΠΊΠ°Ρ€Ρ‚Π°ΠΌ. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ согласно Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ сортировки. Π’ΡƒΠ· ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, вмСсто ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΊΠΎΠ»ΠΎΠ΄Ρ‹ ΠΊΠ°Ρ€Ρ‚ справа Π½Π°Π»Π΅Π²ΠΎ, ΠΏΡ€ΠΎΠΉΠ΄ΠΈΡ‚Π΅ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ: сравнитС Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠ°Ρ€Ρ‚Ρ‹ ΠΈ ΡΡ‚Π°Ρ€ΡˆΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρƒ помСститС Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚Ρ‹, ΠΈ ΠΏΡ€ΠΈ нСобходимости помСняйтС ΠΈΡ… мСстами. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΠΉΡ‚Π΅ сравнСния Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ достиТСния ΠΏΠ°Ρ€Ρ‹ (12, 13). По ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΏΡ€Π°Π²ΠΎΠΌΡƒ ΠΊΡ€Π°ΡŽ ΠΊΠΎΠ»ΠΎΠ΄Ρ‹ Π²Ρ‹ "Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ»ΠΈ" короля ΠΈ пСрСмСстили Π΅Π³ΠΎ Π½Π° послСднюю ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

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