Искусство программирования на Си (984073), страница 42
Текст из файла (страница 42)
° / (г:) йгы 1Ф теис Оръогг беиыые (ыо У!нт тат»бои нд, Алгоритмы ггоргироеки теорегииесгая Осизятс» еяь ссг. я ьаигтг,зяи сяр-ае Гона сер!се»от Методы быстрой гортырояяи Глава 13 ! ыо:П" и ы . г.ио а сы с - -.- - — -" -;а твттДГ л Н Ор;аниэания тынны» ЯЯ вЂ” ' Часть Н Меттннты бысмрой сорэнираени Глава 13 тт х ййе11пе АННЕНТ!х! йепй11 е Еге! х 6 Ев Еа! 1ев Осиное де ыые тыо т еээ трлэлаа не|о Е1~ф~Ц~ф~ ь..ф~~~ф ~~У~ ~.~~~~ !~!,, ~з !„! и1а11с сопит сйаг *611вгт] ( Алторитмы сортировки теотет яссюл цел яя лронзослтелн ос» Мюо.* «ллнес:ео еле~ с тсе "сопнгапг* "11че "регчегне", "гавр , "галс!он , "геиегне , "ногтей "геп", "1г1Н "гмепгу", "гмо НПЬЬ сд От !О ОСЕ ) /е 1 ** функцив для определеввя времеви работа другов функции ЧО 3 1.
ыыяние с о сн ПРЕДУПРЕЕДЕННЕ. Значеввя статическвх переменных изменяется, поэтому программа НЕ '* ДОПУСКАЕТ повторного вхоидения! 4 ы„ве ** Не используйте этот код в многопоточвмх программах! Ч<янМы быстр|а сортировки Гйааа 13 Фее]1пе нлх Рьа 100 гп1 соесс два1п(1п1 агдс, сЬаг «агдч) Омсе Еаеухе Каб1хе Оеар Негде(п" ) ( (ог (рави ра1п( рави <= рвах;] ( Фа[ее[ ОЕВОО 11ега11опв = 1; Фе1ве Фепае[ гпг аопЫе гп1 1опд 1опд Фепб11 Ф][ае[ Фепбу[ 11 [соипг <= 64) ( Ьа = 0 бопЫе вехе Г ппв1дпед 1опд 1опд в1хе г и1ге С сЬаг (пС гпг гп1 гп1 аопЫе Ь; 01[512]; 11(512); СООВТ = 100000011 ра1п, рвах; свах = СООВт; сус1ев = 07 11егасгопи; соппг; рави; раева[3]; чЬ[сЬ = 0; вогггуре; [иеее = 7; *гаггау; *даггау; 11егас1опв /* (1опд) (1еЗ I (1од(рава))]; </ 1; 11 (11ега11опи < 1) 11ега11опи = 17 01[ее[ ОКВОО рггпЫ( рави = $16, 11егаЫопв $1Ап, рави, 11егаг1опв) соппс = рава) вЫ1е (б < ппеповп) ( ОЕВОО рг(пс[("Ьурекев, е1еаепс соппе = $10, 1псегасуопв 51Ип 611вЦвЫсЬ], сопп1, 11егаЫопв) ( Уог [иогссуре = 0; вогееуре < 5( вогГСуре++) ( сус1ев++1 ааее 01ивг1Ь(баггау, гаггау, рави, б)7 Организация данны» Часть (! ФНде[ ОЕВОС Фепд11 Методы бы<трои шртириини Глава (3 РоСв( КОт КОКтЕО")! Ьд + е1арвея С»ве атосе гевеС[" ); Н (!Аггау1воейтптге1убоггед я1(саггау, сопит — 1)) роСв(.КОт ЕОКтЕО"); Н ((Аггау1вое[сп»ге1убоггея д(йаггау, соппг — 1)) Рпгв( КОТ 50КТЕО"); ) Ьгеа(е; саяе 2: Н [(сус1ев + 1) Ъ 2000 == О) рогсЬаг('в')! ) Ьгеас Ьгеас; саяе 4: (ог (К = 0 ! К < Негагтопв: К++) ( вевсру(КС, даггау, соопС * в1яеос 01[0))! аеасру(Н, Таггау, соппс * в1геот 1С(0))! гевег С»пег(); КЬе11вогС яс(Н, соппС)! вт += е1арвед Стае атосе гевег[ "); геяеС Ставя(); ЕЬе11яогС д(КС, сопит); ве) + е1арвед стае в1псе геяеС( ) ! »Е ( [Аггау1вое[сп[ге1убоггед я1(»С, соппС вЂ” 1) ) рягв( КОТ КОКТЕО")! Н (!Аггау1воеНпНе1убоггео д(0С, соппг — 1]) рпсв("КОт бобткО")! ) Ьгеас; саве 3: йог (К = 0; К < Негаг»опв; К++) ( васе д»ягг»Ь(даггау, »аггау, рави, 0), геяеС (1аег()! вегбе вогг вс(1аггау, соопС, рвеС, КАХ КАК)! рс += е1арвед Ссве вгосе гевеС(" ); гевеС с»пег(); пегое вогг д[яаггау, сопит, рвеС, КАХ РАК); рд += е1аряед ссве вспсе гевес(" ); Н ([Аггау1вОе[1п[ге1убоггед в1(гаггау, сопит — 1)) роСв('КОт ЕОКтЕО ); Н ( Гбггау1воеттпНе1убоггед 0(даггау, сопит — 1)) роги('КОТ 50КТЕО')! Мстсаы Лы»ер»й го~» яров»и Ор~а»аз»ц»» далям» Глава !3 Часть !! /* Этот объект определив~ еав набор упорядочеааых секций */ Для получения точного времени следует использо- но загружаем память данными.
Проводим их сортиров/* Б * Будем провзводвть сортировку ло частям. Отсортировавные часта описаны веке. твровку ло частям. Отсортировавные часта описаны ваке. */ вать профилировщик. Многие компиляторы солержат ку и записываем во временный файл. Продолжаем этот профилировщики; можете также приобрести отдельный процесс до тех пор, пока не будут озсортированы все вгагзс Шевег тает(НЛХ Тддр РПЛБ) = (0) ! /» около 2 мпв */ профилировщик, например, уй»ле. данные. Далее с помощь очереди по приоритетам объеДля каждого типа данных, который мы будем сор- диняел! все файлы в один выходной файл.
т Считать следуемый зле хпг гоегйсев(Шенес * р) тироватьч создаем объект сортировки. Объект сортиров Аягарилгч "молниеносная сорти вка" ки будет иметь функцию сравнения (обязательно) и сЬаг 1. Прочитать часть данных, которая помещается в ОЗУ сЬаг рс! функцию распределения (если возможно). К счастью, рс = тдеен(р->Ьитбег, айгео((р->Ьиттег), р->ййп)! у нас будут обе эти функции. Кроме того, у нас булет (не в виртуальной памяти).
й(тйет ввввс массив указателей на функции, которые (указатели) 2. Отсортировать эту часть и записать на диск. Сорзй ((рс) ( будут расположены в соответствии с производительно- тировка производится метолом, оптимачьным для зт ((теот(р->туп)) рпсн(всгеггог(еггпо))! стью алгоритмов для массивов ланных определенного данного размера л»ассизи. ) размера. Независимо от размера массива данных мы 3.
Если исходный файл не исчерпан, перейти к и. 1. Фепдхт будем произволнть сортировку с довольно высокой эф- й. Пставить начала всех временных файлов в очерель фсктивностью. для некоторых массивов данных ыож- по приоритетам и выполнит слияние о исчерпано иметь лаже несколько указателей на функции, поскольку для различных типов данных мы можем использовать различные алгоритмы. Затем макснмаль- Реализация указанного алгоритма на языке С при/* ведена в листинге 13.10. *» Удалить из файлового набора минимальаый элемент в указать конец фавла Ореанивациа доки«о Ь/етоди растров сор~«аравии Глава 13 Часть д /« Считать вз файла бпок строк.
«/ вкаггс 1пь геаб11пев( спас «111е паве, спаг «11оев[), 1пк вах11пев, вгге С * ойувеь ) ( *' [а ве */ и ( (погва11хе(Шеве1 ' [вег, айке Г соппь) Ьед 1опд 1опд 1опд 1рд еос Шевет 1опд гевр Вгвв С Р1ЬК спаг /* двовчввй Ьед = грд совок точки вставке 1; гй («о((веь == О) ( 11 (((гп Ше = (преп(Ше паве реггог((гйе паве)( ехгс(КХ1Т РАХЬОДК) гЬ ))) епд = сопок /« Без этов копвчество эпемевтов данаях).«« д 1э ГЬе ппаЬег оГ 111евекв [КОТ ьпе поаЬег о[ бака /* повск начинается здесь (эта перемеввая двавется к зваченве 1рд) /« текувак точка вставка */ /' повск закаачввается здесь */ /* перемевная дпя времеавого храпения одного файла */ спаг «всдпШп = Тэеь[О).бп((ег; /* Иовет бмть, вам в ае првдетсв ввчего делать (я оптимист).
*/ гй [сопок < 2 [[ 1е[всдо([1п, Тает(1).Ьпуйег)) гегпгп) «/ /« первые эпемевт отсортароваввой часта массвва — это зпемевт О */ 1) /' последней эпемевт отсортвроваввой части массвва — это эпемевт Шевес «/ проверке пекп заверввпся бм только в случае, есле эпемевт с такам значевеем 1пк эйке 1 всаг1с спас вка11с вСа11с п11пев = О э1ге) 11а11) «пем11пе) *хп 111е) *Ьазер, «спг; Методы быетрои сорти/очки Глава 13 Организация до и иых Час И /и Евйе11вогг(Еаек, соапг)) и* Тестовый драйвер вачесошгг сопок( /' Запомввть количество секций '/ и/ (пг ва1п(1пк агдс, сЬаг иагдч(]) /' Объедиавть секции с использоваваем очередв по прворитетам */ ( ыЬНе (сопок > 0) ( 1пг п11пев; е Ев[0].ЬпЕЕег; Епк 1( Ергйпг((Толк, Оа", Ел[0].ЬпЕЕег)( сЬаг епб = 0; Ебе1екев1п(Ев, ьепб]( сваг ие.
И (епб) ( айке Е оЕЕвег О; Ев++; сйаг главе( соплк — ( 1пг вачесочлг; ) Шевег *Ев Евег; ЕпогваИге(Ев, соппг]) вгвгапб(43570]) И (агдс !ы 3) ( /' Сбросить ва диск все открытые файла */ Ерг1пг((вгбегг, "Оваде: Кв гпрп1 111е опгрчг 111е1п-, агдч[0])( НЕовй(ДОЬЬ]( гегчгп 1; /' Эакрвть и удалить все аремеввме файлы +/ ) Еог (1 = О( 1 < Ватеосплг) 1++) ( Еочг (орел(агдч[2), "ыЬ"]; Ес1ове(Евек[1].ййп); и (Еопг == ВОЬЬ] ( И (ГВВОЧЕ(ЕВЕК[1].ШЕлама] (ы 0) ( рг1пг(( Сочпг пог орел гв(п", агдч(2]); рггпИ[ ппаЬЕе Ео Ое1еге Ше Фв(п", Тает[1].Шепаве]( ек11(ВХ1Т РА1ЬОВВ]) рпгв(вггеггог(еггпо))) ) Деревья Скотт Флурер Резюме быть опушены, что может привести к снижению эффек- тивности сортировки, а иногла и к опасности выполнеСортировка, как и многие другие задачи, решаемые ния такой сортировки.
Это крайне неприятно, поскольвычислительной техникой, является сочетанием искус- ку сортировка является одной из наиболее важных и ства и науки. Для определения оптимального метода часто используемых операций, выполняемых вычисли- необходимо немного поэкспериментировать. Интерфейс тельной техникой. функции цэоггО, определенной в библиотеке <эы!!ь.ь>, часто говорят, что поразрядная сортировка не подимеет один недостаток, связанный с обрашением к фун- ходит для сортировки произвольных данных.
Но, ис- В ЭТОЙ ГЛАВЕ кции зпезпсруО. Но можно ввести простой шаблон, ко- пользуя шаблон, аналогичный шаблону, применяемому торый позволяет устранить недостатки интерфейса фун- в сортировке сравнением, можно добиться выполнения кции йзоггО за счет некоторого увеличения объема кола. поразрядной сортировки для любых данных. Все, что не- ° Структура данных типа дерево Опьп показывает, что при работе с небольшими фай- обходимо, — найти функцию распределения наиболее лами не следует переходить на алгоритм сортировки значащих битов в секциях.