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

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

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

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ дСсятки Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сортировки. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ со своими характСристиками, своими достоинствами ΠΈ нСдостатками. ΠŸΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ для использования для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Алгоритмы сортировки

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

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

ΠšΠΎΠ΄Ρ‹ для основных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² сортировки, описанных Π² этой Π³Π»Π°Π²Π΅, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ². ПослС Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² ΠΎΡ‚Ρ‹Ρ‰ΠΈΡ‚Π΅ срСди Π½ΠΈΡ… Ρ„Π°ΠΉΠ» TDSorts.pas.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΌΡƒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π²Π²Π΅Π΄Π΅ΠΌ нСсколько Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ». ВсС Ρ‚ΠΈΠΏΡ‹ сортировок, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны Π½ΠΈΠΆΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ сравнСниС. Π§Ρ‚ΠΎΠ±Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ "Π·Π½Π°Π»", ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ элСмСнты Π² спискС, ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой. ΠœΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ сортировки для Ρ†Π΅Π»Ρ‹Ρ… чисСл, строк ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠ° TMyRecord. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ сортировки Π±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ. ΠŸΡ€ΠΈΠΌΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сортировку элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°Π½Ρ‹ указатСлями. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ использовали ΠΏΡ€ΠΈ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ…: Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°Π΄Π°ΡŽΡ‚ΡΡ ΠΈΡ… указатСлями. ΠžΡ‚Π΄Π΅Π»ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚ манипулирования ΠΈΠΌΠΈ, ΠΌΡ‹ удСляСм большС внимания характСристикам Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈΠ»ΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ…, Π° Π½Π΅ занимаСмся Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ†Π΅Π»Ρ‹Ρ… чисСл, строк ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ….

Π’ этой Π³Π»Π°Π²Π΅ элСмСнты Π±ΡƒΠ΄ΡƒΡ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сравнСния, описываСмой стандартным ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠΌ TtdCompareFunc. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки Π² качСствС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сравнСния.

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

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

Листинг 5.1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° попадания индСкса Π² допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ индСксов для массива TList


procedure TDValidateListRange(aList : TList;

aStart, aEnd : integer; aMessage : string);

begin

if (aList = nil) then

raise EtdTListException.Create(Format(LoadStr(tdeTListlsNil), [aMessage]));

if (aStart < 0) or (aStart >= aList.Count) or

(aEnd < 0) or (aEnd >= aList.Count) or (aStart > aEnd) then

raise EtdTListException.Create(Format(LoadStr(tdeTListInvalidRange),

[aStart, aEnd, aMessage]));

end;


Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΄ΠΎ сортировки массива Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ прСимущСство. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ доступа ΠΊ элСмСнтам массива TList - это свойство Items. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это свойство ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ, Ρ‚.Π΅. вмСсто MyList.Items[i] Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ MyList[i]. НСсмотря Π½Π° ΠΊΠ°ΠΆΡƒΡ‰ΡƒΡŽΡΡ простоту, здСсь скрыта большая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, Ссли Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± эффСктивности сортировки. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ MyList [i] ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ компилятор вмСсто Π²Ρ‹Π·ΠΎΠ²Π° элСмСнта вставляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ MyList.Get(i) - ΠΌΠ΅Ρ‚ΠΎΠ΄ записи свойства Items. И ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Get, - провСряСт, Ρ‡Ρ‚ΠΎ индСкс i находится Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ ΠΎΡ‚ 0 Π΄ΠΎ Count-1. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ссли ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сортировки ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ индСкс ΡƒΠΆΠ΅ находится Π²Π½ΡƒΡ‚Ρ€ΠΈ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° индСксов массива. Π’ΠΎ ΠΆΠ΅ относится ΠΈ ΠΊ записи значСния Π² MyList[i]: вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Put, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ провСряСт ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π΅ΠΌΡƒ индСкса Π²Π½ΡƒΡ‚Ρ€ΡŒ допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ свойство Items, ΠΌΡ‹ выполняСм Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΉ объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹: Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΉ индСкс. НС ΠΎΡ‡Π΅Π½ΡŒ-Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

МоТно Π»ΠΈ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ индСксов? К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, это Ρ‚Π°ΠΊ. Класс TList ΠΈΠΌΠ΅Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ свойство - List. Π­Ρ‚ΠΎ свойство, доступноС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΈΠΏΠ° PPointerList Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ массивом TList для хранСния элСмСнтов. НикакиС Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π½Π΅ производится. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, примСняя это свойство, ΠΌΡ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ Π½Π° сСбя ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°Ρ… чтСния ΠΈ записи ΠΌΡ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π·Π° Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ массива.

ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ всС Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π²ΠΈΠ΄Π°:

Π’ΡƒΡ€Π΅

TtdSortRoutine =procedure(aList : TList;

aFirst, aLast : integer;

aCompare : TtdCompareFunc)

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

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Ρ€ΠΈ основных Ρ‚ΠΈΠΏΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для тСстирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сортировки. МоТно ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, находящиСся Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС (пСрСтасованныС Π΄Π°Π½Π½Ρ‹Π΅, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅), ΡƒΠΆΠ΅ отсортированныС Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, отсортированныС Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Вторая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π½Π° отсортированном спискС - Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π² ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ситуации Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ нСэффСктивно.

Бписок, отсортированный Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊΠΆΠ΅ являСтся критичСским для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² - ΠΌΠ½ΠΎΠ³ΠΈΠ΅ элСмСнты Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ попадания Π² Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

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

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

ВасованиС массива TList

Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‚Π°ΡΠΎΠ²Π°Ρ‚ΡŒ элСмСнты массива TList? Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· вас Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ самый простой: ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива, ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π΄ΠΎ послСднСго, ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ с Π΄Ρ€ΡƒΠ³ΠΈΠΌ, случайно Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ элСмСнтом. РСализация Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π² Delphi Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Листинг 5.2. ΠŸΡ€ΠΎΡΡ‚ΠΎΠ΅ тасованиС элСмСнтов


procedure TDSimpleListShuffie(aList : TList;

aStart, aEnd : integer);

var

Range : integer;

Inx : integer;

Randomlnx : integer;

TempPtr : pointer;

begin

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

Range := succ(aEnd - aStart);

for Inx := aStart to aEnd do

begin

Randomlnx := aStart + Random (Range);

TempPtr := aList.List^[Inx];

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

aList.List^[RandomInx] := TempPtr;

end;

end;


А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, сколько ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. ПослС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ выполнСния Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· n Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ (ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСставлСн с Π»ΡŽΠ±Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ самого сСбя). ПослС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ выполнСния Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ снова ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· n Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ совмСстно с n комбинациями послС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ выполнСния Π΄Π°Π΄ΡƒΡ‚ n(^2^) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ послС выполнСния всСго Ρ†ΠΈΠΊΠ»Π° ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· n(^n^) Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ.