Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сортировки.doc
Скачиваний:
1
Добавлен:
19.09.2019
Размер:
79.36 Кб
Скачать

Быстрая

Метод основан на подходе "разделяй-и-властвуй". Общая схема такова:

  1. из массива выбирается некоторый опорный элемент a[i],

  2. запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные a[i], влево от него, а все ключи, большие, либо равные a[i] - вправо,

  3. теперь массив состоит из двух подмножеств, причем левое меньше, либо равно правого,

  4. для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.

В конце получится полностью отсортированная последовательность.

O(n log n)

Слиянием

Про­це­ду­ра слия­ния тре­бу­ет два от­сор­ти­ро­ван­ных мас­си­ва. За­ме­тив, что мас­сив из од­но­го эле­мен­та по опре­де­ле­нию яв­ля­ет­ся от­сор­ти­ро­ван­ным, мы мо­жем осу­ще­ствить сор­ти­ров­ку сле­дую­щим об­ра­зом:

  1. раз­бить имею­щие­ся эле­мен­ты мас­си­ва на па­ры и осу­ще­ствить слия­ние эле­мен­тов каж­дой па­ры, по­лу­чив от­сор­ти­ро­ван­ные це­поч­ки дли­ны 2 (кро­ме, быть мо­жет, од­но­го эле­мен­та, для ко­то­ро­го не на­шлось па­ры);

  2. раз­бить имею­щие­ся от­сор­ти­ро­ван­ные це­поч­ки на па­ры, и осу­ще­ствить слия­ние це­по­чек каж­дой па­ры;

  3. ес­ли чис­ло от­сор­ти­ро­ван­ных це­по­чек боль­ше еди­ни­цы, пе­рей­ти к ша­гу 2.

В ре­мя ра­бо­ты сор­ти­ров­ки слия­ни­ем со­став­ля­ет

Для решения задачи сортировки эти три этапа выглядят так:

  1. Сортируемый массив разбивается на две части примерно одинакового размера;

  2. Каждая из получившихся частей сортируется отдельно, например — тем же самым алгоритмом;

  3. Два упорядоченных массива половинного размера соединяются в один.

1.1. - 2.1. Рекурсивное разбиение задачи на меньшие происходит до тех пор, пока размер массива не достигнет единицы (любой массив длины 1 можно считать упорядоченным).

    1. Cоединение двух упорядоченных массивов в один. Основную идею слияния двух отсортированных массивов можно объяснить на следующем примере. Пусть мы имеем два подмассива. Пусть также, элементы подмассивов в каждом из этих подмассивов отсортированы по возрастанию. Тогда: 3.2. Слияние двух подмассивов в третий результирующий массив. На каждом шаге мы берём меньший из двух первых элементов подмассивов и записываем его в результирующий массив. Счетчики номеров элементов результирующего массива и подмассива из которого был взят элемент увеличиваем на 1. 3.3. "Прицепление" остатка. Когда один из подмассивов закончился, мы добавляем все оставшиеся элементы второго подмассива в результирующий массив.

Пирамидальная

Пи­ра­ми­да — дво­ич­ное де­ре­во, в ко­то­ром зна­че­ние каж­до­го эле­мен­та боль­ше ли­бо рав­но зна­че­ний до­чер­них эле­мен­тов.

  • За­пол­нив де­ре­во эле­мен­та­ми в про­из­воль­ном по­ряд­ке, мож­но лег­ко его от­сор­ти­ро­вать (лег­че, чем ис­ход­ный спи­сок эле­мен­тов), пре­вра­тив в пи­ра­ми­ду.

  • Са­мый боль­шой эле­мент пи­ра­ми­ды на­хо­дит­ся в её вер­ши­не.

  • От­де­ля­ем вер­шин­ный эле­мент, и за­пи­сы­ва­ем его в ко­нец ре­зуль­ти­рую­ще­го мас­си­ва.

  • На ме­сто вер­шин­но­го эле­мен­та за­пи­сы­ва­ем эле­мент из са­мо­го ниж­не­го уров­ня де­ре­ва.

  • Вос­ста­нав­ли­ва­ем (пе­ре­сор­ти­ро­вы­ва­ем) пи­ра­ми­ду.

  • Са­мый боль­шой эле­мент из остав­ших­ся сно­ва в вер­ши­не. Сно­ва от­де­ля­ем его и за­пи­сы­ва­ем его в ка­че­стве пред­по­след­не­го эле­мен­та ре­зуль­та­та, и так да­лее...

  • Весь фо­кус ал­го­рит­ма в том, что пи­ра­ми­да без до­пол­ни­тель­ных за­трат хра­нит­ся пря­мо в ис­ход­ном мас­си­ве. По ме­ре то­го, как раз­мер пи­ра­ми­ды умень­ша­ет­ся, она за­ни­ма­ет всё мень­шую часть мас­си­ва, а ре­зуль­тат сор­ти­ров­ки за­пи­сы­ва­ет­ся на­чи­ная с кон­ца мас­си­ва на осво­бо­див­шие­ся от пи­ра­ми­ды ме­ста.

До­пу­стим, у нас име­ет­ся по­сле­до­ва­тель­ность чи­сел:

1, 4, 2, 7, 8, 0, 5, 2, 6.

Что­бы по­стро­ить пи­ра­ми­ду, нуж­но до­бить­ся, что­бы все эле­мен­ты но­мер i бы­ли боль­ше эле­мен­тов но­мер   и  . На­при­мер, ну­ле­вой эле­мент дол­жен быть боль­ше пер­во­го и вто­ро­го. В на­шем при­ме­ре это не так, по­это­му по­ме­ня­ем ну­ле­вой эле­мент и пер­вый:

41, 2, 7, 8, 0, 5, 2, 6.

Пер­вый эле­мент (еди­ни­ца) дол­жен быть боль­ше тре­тье­го (се­мёр­ки) и чет­вёр­то­го (вось­мёр­ки). Для это­го по­ме­ня­ем ме­ста­ми еди­ни­цу и вось­мёр­ку:

4, 8, 2, 7, 1, 0, 5, 2, 6.

По­ме­ня­ем ме­ста­ми ну­ле­вой и пер­вый эле­мен­ты, что­бы вос­ста­но­вить по­ря­док в на­ча­ле:

84, 2, 7, 1, 0, 5, 2, 6.

Сно­ва пер­вый и тре­тий не в по­ряд­ке. По­ме­ня­ем ме­ста­ми чет­вёр­ку и се­мёр­ку:

8, 7, 2, 4, 1, 0, 5, 2, 6.

Вто­рой эле­мент (двой­ка) дол­жен быть боль­ше пя­то­го (ну­ля) и ше­сто­го (пя­тёр­ки). Это не так. По­ме­ня­ем ме­ста­ми двой­ку и пя­тёр­ку:

8, 7, 5, 4, 1, 0, 2, 2, 6.

Ана­ло­гич­но, чет­вёр­ка долж­на быть боль­ше по­след­них двой­ки и ше­с­тёр­ки. По­ме­ня­ем ме­ста­ми чет­вёр­ку и ше­с­тёр­ку:

8, 7, 5, 6, 1, 0, 2, 2, 4.

По­след­ние пять эле­мен­тов не с чем срав­ни­вать; их мы не тро­га­ем. Те­перь свой­ство пи­ра­ми­ды вы­пол­не­но для всех эле­мен­тов. Пи­ра­ми­да по­строе­на.

Об­ра­ти вни­ма­ние, что пер­вый эле­мент (се­мёр­ка) ни­как не свя­зан со вто­рым (пя­тёр­кой), по­это­му они оста­ют­ся в «не­пра­виль­ном» по­ряд­ке.

По­сле то­го, как пи­ра­ми­да по­строе­на, из неё мож­но по­лу­чить пол­но­стью от­сор­ти­ро­ван­ный мас­сив. Осо­бен­ность пи­ра­ми­ды в том, что в её вер­ши­не (ну­ле­вой эле­мент) на­хо­дит­ся мак­си­маль­ный эле­мент сре­ди всех эле­мен­тов пи­ра­ми­ды. Но мак­си­маль­ный эле­мент дол­жен быть в кон­це мас­си­ва. По­ме­ня­ем ме­ста­ми ну­ле­вой и по­след­ний эле­мен­ты, и боль­ше не бу­дем по­след­ний эле­мент счи­тать ча­стью пи­ра­ми­ды:

4, 7, 5, 6, 1, 0, 2, 2 | 8.

Пи­ра­ми­да при этом на­ру­ша­ет­ся. Вос­ста­нав­ли­ва­ем её так, как стро­и­ли вна­ча­ле (вось­мёр­ку при этом не учи­ты­ва­ем):

7, 6, 5, 4, 1, 0, 2, 2 | 8.

Сно­ва са­мый боль­шой эле­мент пи­ра­ми­ды на­хо­дит­ся вна­ча­ле. Этот эле­мент — са­мый боль­шой из остав­ших­ся сле­ва от вось­мёр­ки. По­это­му он дол­жен быть пе­ред ней. Ме­ня­ем ме­ста­ми ну­ле­вой эле­мент и по­след­ний эле­мент пи­ра­ми­ды, и от­де­ля­ем по­след­ний эле­мент от пи­ра­ми­ды:

2, 6, 5, 4, 1, 0, 2 | 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

6, 4, 5, 2, 1, 0, 2 | 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

2, 4, 5, 2, 1, 0 | 6, 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

5, 4, 2, 2, 1, 0 | 6, 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

0, 4, 2, 2, 1 | 5, 6, 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

4, 2, 2, 0, 1 | 5, 6, 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

1, 2, 2, 0 | 4, 5, 6, 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

2, 1, 2, 0 | 4, 5, 6, 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

0, 1, 2 | 2, 4, 5, 6, 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

2, 1, 0 | 2, 4, 5, 6, 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

0, 1 | 2, 2, 4, 5, 6, 7, 8.

Вос­ста­нав­ли­ва­ем пи­ра­ми­ду:

1, 0 | 2, 2, 4, 5, 6, 7, 8.

Ме­ня­ем ме­ста­ми на­чаль­ный и по­след­ний эле­мен­ты пи­ра­ми­ды, от­де­ля­ем по­след­ний эле­мент:

0 | 1, 2, 2, 4, 5, 6, 7, 8.

В пи­ра­ми­де остал­ся един­ствен­ный эле­мент. Он са­мый ма­лень­кий из всех. Про­сто при­со­еди­ня­ем его к мас­си­ву:

0, 1, 2, 2, 4, 5, 6, 7, 8.

Вот и всё! Мы лег­ко и быст­ро от­сор­ти­ро­ва­ли мас­сив из де­вя­ти чи­сел.

Вре­мя ра­бо­ты ал­го­рит­ма —   в сред­нем, а так­же в луч­шем и худ­шем слу­ча­ях.