![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Jolia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 12.3.2007 Репутация: нет Всего: нет |
Здравствуйте все!Помогите пожалуйста разобраться с пирамидальной сортировкой: код я раздобыла а вот понять его никак не получается, не могли бы вы помочь комментариями?) И еще осуществить пошаговый вывод промежуточных результатов. Очень надеюсь на вашу помощь! Всем заранее спасибо за внимание!
Это сообщение отредактировал(а) Jolia - 19.5.2008, 18:31 |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Я бы помог с комментариями, но найдя вот эту статью http://ru.wikipedia.org/wiki/Пирамидальная_сортировка я думаю, объясню только хуже. Если будут вопросы, задавай.
|
|||
|
||||
| Jolia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 12.3.2007 Репутация: нет Всего: нет |
статью прочитала, теоретически вроде понятно, но относительно кода вообще туго, не разберу что где и как происходит. Если не сложно все-таки помоги пожалуйста комментариями=)
|
|||
|
||||
| dizzy1984 |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
Только для тебя, Jolia!
Разберу пример для сортировки по возрастанию. Пример беру из википедии. Рассказываю как понял. Сортировка строится с использованием бинарного дерева с наложенными на него ограничениями (нет листов с глубиной отличной от максимально возможной более чем на 1 и значение в любой вершине больше или равно значений потомков этой вершины - это для возрастающей сортировки - для убывающей наоборот - значение в любой вершине меньше или равно значений потомков этой вершины). Почему у дерева именно такие особенности - это тема для отдельного разговора (я ничего тут не скажу) поэтому примем это как данность. Так вот странное дерево, СД далее , строящееся в соответствии с входным ветором имеет такую особенность (уже после его полного построения), что в его корне находится самый большой(сортируем по возрастанию) или маленький(сортируем по убыванию) элемент масива. А это уже кое-что. Читай дальше. Для хранения СД используют обычный массив. Если вершина имеет индекс i, то ее потомки имеют индексы 2i и 2i + 1. Так можно построить СД - помещаем 1-й элемент в корень, 2-ой и 3-й будут его детьми, дети 2-го - 4-й и 5-й и т.д Процесс сортировки проходит в 2 этапа на первом этапе мы строим СД (в википедии вместо "странное дерево" используют "пирамида", но смысл остается тем же). Вот код которые его строит
Это подготовительный этап. Используется функция downHeap. Что она делает? Она протаскивает данную ей вершину пока та не перестанет быть причиной неудовлетворения условия "значение в любой вершине больше или равно значений потомков этой вершины". Для построения нормального СД достаточно протащить все вершины, имеющие потомков, т.к вершины без потомков неудовлетворять такому условию не могут в принципе.
Ну не знаю как тут прокомментировать кроме уже имеющегося. Повторю! T new_elem = a[ k ]; // Записываем протаскиваемый элемет, он пригодится позднее while( k <= n / 2 ) // пока у a[k] есть дети. Т.к для i первый ребенок это 2i, то i>n/2 заведомо бездетен. Он ребенок а дети нас не интересуют.
Далее мы определяемся с самым большим ребенком и меняем его с протаскиваемым элементом. Если все в поряде и условие "значение в любой вершине меньше или равно значений потомков этой вершины" выполняется то менять не нужно. Таким образом мы протащили его в следующий узел. Далее процедура повторяется для следующего узла вплоть до бездетных т.к, иначе мы могли бы испортить СД, расположенное ниже текущего. a[ k ] = new_elem; // Ставим корректное значение протаскиваемого элемента. На втором этапе мы можем использовать СД для получения последовательности элементов. Это просто - мы берем элемент в корне и ставим его на последнее место - там он и должен стоять при сортировке по возрастанию, после чего нас начинает интересовать только остальные элементы. Элемент незаслуженно стоявший на последнем месте ставится на первое и т.к дерево при этом перестает быть СД, происходит его протаскивание результат которого - новый максимальные элемент нового СД. Процедура повторяется. Массив отсортирован.
Вот код который использет эту сортировку
И теперь визуализация - если не рисовать граф, то можно показать процесс появления самых больших элементов, набивающихся в конец массива. Т.е сделать вывод массива после строк
Справишся? Это сообщение отредактировал(а) dizzy1984 - 21.5.2008, 10:13 |
||||||||||||
|
|||||||||||||
| Jolia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 12.3.2007 Репутация: нет Всего: нет |
ооо вот это обьяснение) спасибо большооое) слушай, а как переделать код чтоб сортировка выполнялась по убыванию? я попробовала знаки поменять - и нифига не сортирует
|
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
А я говорил
|
|||
|
||||
| Jolia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 12.3.2007 Репутация: нет Всего: нет |
Спасибо4ки большушее)))
|
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |