2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Сортировка массивов
Сообщение23.09.2006, 19:01 


23/09/06
2
Привет! У меня проблема - надо объединить 100 уже отсортированных массивов в один. Количество элементов в каждом известно. Требование (как обычно) - минимальные временные затраты. Научник настаивает на использование "пирамидальной" сортировки.
Я алгоритм этой самой сортировки нашла и в Вирте, и в Кнуте, но как приспособить его к своей задаче до меня не доходит.
Я так полагаю, что сложность должна оцениваться примерно в nlog(100) операций, n - количество элементов в итоговом массиве.
Буду благодарна за любые идеи.

 Профиль  
                  
 
 
Сообщение23.09.2006, 20:34 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Не верьте научнику! — будут тут всякие говорить, — никому не верьте! и мне тоже не верьте!:D но в данном случае он, похоже, прав.

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

Для ста проходит аналогичная идея, но возникает вопрос, как искать наименьший элемент из ста. Вот тут-то и приходит на помощь куча (она же пирамида, а впросторечье heap из heapsort). Представьте себе, что мы сортируем объекты. У каждого объекта есть метод, выдающий его ключ для сортировки. Я думаю, Вам уже понятно, как построить из них кучу, правда? Теперь все просто: объект — это неиспользованная часть массива, ключ — первый неиспользованный элемент. В начале строим кучу, а вот операция разбора немного другая:

1) Из кучи берется наименьший элемент.

2) Из него выталкивается значение в итоговый массив.

3а) Остаток массива не пуст. Тогда ключ массива изменился, и мы начинаем проталкивать этот массив с вершины кучи вниз.

3б) Это был последний элемент. Поступаем, как все поступают с кучей — берем последний элемент в куче и начинаем проталкивать его вниз.

Каждый шаг в куче, действительно делается за самое большее $\log_2 100$, и все за $n \log_2 100$.

 Профиль  
                  
 
 
Сообщение23.09.2006, 21:09 


23/09/06
2
Большое спасибо за ответ. Попытаюсь реализовать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group