Искусство программирования на Си (984073), страница 40
Текст из файла (страница 40)
и Кнут (Кпш!з) нс зря осмеивают метод пузырьковой создан интерфеис пад управлением уувк(оы*, но старый «и- ном. "Так, дев)шки, — сказал Дик, — вРемя сортировать 4. Положить носок на только что освобозкленное на сортировки как алгоритм порядка О(п') и в отношении терфейс был намного богаче, и мне ега очень не хвата- носки, но тот, кто будет сортировать, должен напеть эти пол место. количества сравнений, н в отношении количества пер, ла (х бып одним из настоянных папьзоватепеи системы). очки, а тот, кто без очков, нс должен говорить, куда Итак, не выполняйте пузырьковую сорт»розку. Никогда и 5 Если в корзине сшс остались носки, перейти к п.
! становок. По этой жс причине он часто приводится в положить носок". Методы бисирой <иртирииии Глава 13 /» Простая сортировка методом лиаейаык вставок. Сортлролка с длоичаммл лстаэкамл лучие, а сортироэка методом Велла еие лучее. */ ЧОО й ЬТКЕККГВВЕКттОК(кеуре а[), ппз1япек 1опя л) ( (ог (1 = 1; г < и; 1++) /* аайти точку естаэка */ Гог () = г/ ) > О ЬЬ Ст(а[) - 1), а[))); ) †) [ /' Переместить эсе элемеаты дальле а эстаэлть текуиил элемеат. */ ЕиР = а[1)1 а[1) = а[1 - 1); а[) — 1) = Сир; Листинг 13.1. Сортировка методом линейных вставок. Листинг 13.2. Сортировка с двоичными вставками.
/и Зто простой алгоратм сортлроэкл с длоичамма вставками. Сортлроака с длоичлмми эсталкама э предаем аамаого быстрее сортиролки методом ллаейимк астаэок, а сортировка методом Велла еле быстрее. Вл, молет быть, сами покепаете протестароаать сортироаку с дэолчамма вставками а сортлроэку методом Велла, во я пОДОЗрЕЭап, чтО аа больлилстле систем сортировка методом Велла будет быстрее.
ппайдпед 1опд '/ )! чо) В 1Е5ект1ок5окт(ееуре актау[), опл[дпеа 1опя сопле) Есуре елр; ( ппайялеп 1опд рагекггол/ /* колец полого сегиеата */ 1олд Ьед/ /* Поиск пачиаается здесь (эта перемеалая перемещается к 1рд) '/ 1опд )ря' /' текулая точка астаака (посередлле мекду Ьед а епд) 1опд епк) /* Поиск закаачилается здесь */ Егуре ееир; /* Перемеиаая предаазаачела для лремеааого крааеаия одаого элемелта массива */ /' По определеаал, сортлруется один элемеат. Формируем асе болыие а болыие упорядочелаые ) сегменты до тек пор, пока весь маслил ле будет отсортировал.
*/ ) (ог (рагс1Е1оп = 11 рагс1Е[оп < сопит/ рагс1Е1оп++) ( /и длоачаыл плеск точки эстаэка */ Ьед = трд = 01 /* Перэый элемеет отсортиролаиаой части масслла — это Поскольку девушки смогут осмотреть нлн перемес- на носок, который лежит посередине межл) нашими Я Р л Оргаиизаии» данило $Щ !! Часть и А<от»дыби<трои сортирооси ф$~Я Глава 13 ЯЙЙ$ К счастью, количество сравнении очень невелико. Тем Шелла О-нотация точно неизвестна, но известно. что носки".
"Нет. Я прилумал кос-что другое". Дик любит "Я принсез пилу", — сказала Вики. не менее, количество перемещений, которое равно ко- при разумном выборе последовательности длин шагов игрспь в покер Он часто играет со своими друзьями из "Нез, нет. Ничего такого не нужно. Мы просто различеству перемещений при сортировке методом линей- Ь он илшст порядок сложности, близкий к О1П'ч). За- Дспартамента порог. Обычно он выигрывает намного делим все монеты на несколько кучек".
ныл вставок, существенно снижает скорость этого мс- чем нужна сортировка методом Шелла? Выполнение болли<с, чем пРоигРывает, и Уже собРал большУю кол- бра<пой быстрой <ортирояии тода. Если бы пал< прихолилось перемещать все носки, этого метода сортировки обусловлено наличием нс- лслцпю мелочи. Он принес пшлонную банку, полную 1. Высыпать все монеты в одну кучу. то работы было бы нс меньше, чем раньше Но сели скольких больших элементов в массиве данных, кото- монст. "Отсортируйте вот это и нс забудьге про очки.
перса началом сортировки список уже был отсортиро- рый необходимо отсортировать, Иногда самый Гюлыпой Правила остаются теми же. Только тот, кзо носит очки, 2. Взять из кучи одну монету. ван, нам вообще нс придется перемещать элементы. В элемент люжет стоять на первол< месте. В таком случае может сортировать монеты. Другис должны молчать".
3. Если монета имеет большой номинал, положить ее ланнол< случае л<ы простодобавлясм носок в конец спис- сортировка л<етолол< вставок на каждом шаге будет ве- "да тут их тысячи! Может даже сотни тысяч! С на- в другую лучу справа. ка. Поэтому общее количество т»пераций может быть ремешать этот элемент на одну позицию правее 1нижс) шими л<етодами сортировки носков мы не справимся и 4.
Если монета имеет небольшой номинал, положить всего 512,5. Слеловательно, сортировка носков займет, Максимальныи элемент будет перемешаться и — 1 раз за день!" — расстроилась Мэрилин. И тут Ните пришла схорсс всего, около 49 минут, хотя, если носки уже Но эзо ешс не самос плохое. Иногда рядом с ним нахо- в голову великолепная идея: "Мы поделим их пополам". были отсортированы, то можно справиться и за 8,5 дятсядругис большие элементы. Они также, каки мал..
минут. сг<л<альный элемент, будут перемешаться в конец мас- Листинг 1З.З. Сортировка методом Шелла. Очевидно, что сортировка двоичными вставками сива. В некоторых очень редких случаях ясе элементы гораздо»<)офек<ивисе сортировки методом линейных располагакпся в массиве в обратном порядке (хужс нс ** поспедоватепьвость дпвп магов Ь я этоя версия метода Велла взята яз дапдьоок ог А10осусьая вставок. Для малых лшссивов пашнях (около 20 элемсн- придумаешь]. Воз это действительно проблема для сор- апб ояея ягспсепгяя лп Раяса1 апб С, Саяеоп Соппяе, д)сагбо Ваеяа-уаеея, А001яоп Иея1яу; тов) сортировка двоичными вставками является, навер- тировки методом вставок! 1БВВ< 0201416027 нос, елинственным ш<горитмом, который следовало бы Именно в таком слу ~ас помошет сортировка мото° * У мявя ята последовательность дает л чаво роз пьтаты, чем у Седавяяа 1эедоеыгск) прв попвой у мявя ята последовательность да т у р у , у д 1 0 ) Р О иза даьлмх ргаьиюяих Мемеда беьмрьагармьрпвхи ЩД ! Часть П Глава 13 5.
Перейти к п. 2 лля каждой кучи, пока во всех ку- танется по одной монете„все монеты окажутся пол- >рак мы никогла не закончим!" — засзоггала Джули ПИ(зЗМИДЗЛЬНЗЯ СО(зТИРОВКВ чах не окажется по одной монете. Поскольку кучи постыл упорядоченными. "Давайте посмотрим, что мы сделали не так, — скамонет с большим номиналом находятся справа, а с зала Мэрилин. — Я заметила, что иногда мы берси пен- Однажды семья Джонс решила провести турнир по Реализация этого алгоритма на С приведена в лис- ни «енни — с маленькая и и с а ((о мы можем шашкам. Все значи, что лУчший игРок — Дик, поэтом) меньшим номиналом — слева, то, когда в кучах оси „„, нс бра, енин, поскольку в куче мо,ут бьгть в и'Рвом 'УРе он нс ИГР' " Что 'ае"и всех остазьных, только пенни.
По<ему бы нам просто нс перемешать го они пытазись свести самых стаРших игРоков (и, возкуч> и не выбрать из нес несколько монет лругого лос- можно, самых хоРоших) с самыми молод™ (и, воз- /» 9 люжно, самыми плохими). Реа играла с Вики, Мэрилин— Првмвтвввая бвстрая сортвровка. Этот алгоритм везфйектввев дпя общих цепей. пе вспопьзуйте его. тоинства. А затем мы б>дсм брать срелнюю из них и */ разделять монеты на кучи с ее использованном". чо16 ПВОПЭВ(йсур Л, (пс 1, упс г) ( (у (1 < г) вснз кучу — а вдруг ее не нужно булет сортир звать?" игРал, а МэРилин преполнесла первую неожиданность.
Л > Реи была идея ешс лтчше "я заметила что вы Ко всеобшсму уливлснию, она вьпвла победителем и 1пе 1, веуре евр, Почем> бы вам для сортировки маленьких куч нс ис т)рниры часто проводятся именно по такои схеме, явпольювать тс жс методы кото ые вы использовали п(п, ляется опрслсление наилучшего игрока (на сеголняш/* Разделить кучи ва сегмевтв ь/ уог (:;) ( сортировке носков! Я ручаюсь, вы сэкономите уим) ""и ле"ь) Д>чш"с и"Ро»и перемсша"зтсв ""ерх по свис ку. о терминологии вычислительной техники такая в емснп" к . П )зл))ч' н Организаиио данных Часть й (лля которых мы должны были бь1 выполнять пирами- СОРТИРОВКО ПОДСЧЕТОМ дальную сортировку) эти пирамиды не дают такой эффективности, как более простые азгорнтмы.
Так как жс После очеРслного плохого повелениа сестеР возврашанам выполнять сортировку с помошью пирамид? Мы смсЯ к нашей банке с мелочью. Но на этот Раз Дик принес пятигаллонное ведро, до краев заполненное монс- верхний элемент до тех пор, пока пирамида не окажет- тами. ся пу й.
Но такая сортировка так жс неэффективна, Мы больше никогда не Увидим солнечного света",— как и быстрая сортировка. А те случаи, в которых быстрая сортировка нс срабатывает, случаются настолько нечасто, что реализовывать пирамидальную сортировони долго сплели и д мали.
"С тем же успехом мы мог к становится нецелесообразно. ку становится нецелссоо разно. ли бы отсортировать целую ванну мелочи, — сказала Если рассмотреть обший счучай поведения метолов Мэрслин. — Мы никогда их не отсортируем . ен п ишла идея "Банки' Нам пот сбудет быстрой и пирамилальной сортировки, то гв срслнелг) И туг Карен пришла идея: "Банки. Нам потребует метод пирамидальной сортировки окажется горазло мелленнее. Вот какой врел может нанести провслсние пиралгилальггой сортировки.
Прелставьтс себе специаль- называть ну:аную банку, а остальные будут подносить ную таблицу, которую раздали лбббб сотрулникам. эту банкУ, — ответила КаРен. — Это не наРУшает пра вила, поскольк тот, кто носит очки, кладет монету в В таблице содср;кится информация о сотрулниках. Иногда нам приходится находить сотрудника по имс- нужную анку и говорит оставь ~~~' и гово ит остальным, что они лолжпго лелать". тетоды быстрой сортирооно Глава 13 яс)и~ йретоди Гиестрст сори ироиии Ореаиизааии даииих ! Глава 13 Часть в списка. При этом для кажлого элемента поналобится место для хранения по крайней мере одного указателя.