Понимание и решение сортировки слияния K-Way

Am to

1) подсчитайте количество сравнений, необходимых для сортировки слиянием k-Way для сортировки случайной перестановки чисел от 0 до N-1.

2)

для подсчета количества перемещений данных, необходимых для K-Way merge sort o сортировать случайную перестановку чисел от 0 до N-1.

Я понимаю, как 2-way merge sort работает правильно, и очень хорошо понимаю код. Моя проблема в том, что я не знаю, с чего начать, и мне нужна небольшая помощь. Как преобразовать 2-полосную объедините сортировку в K-Way, чтобы я мог решить вышеуказанные проблемы.

Я некоторое время гуглил, но не могу найти учебник, который поможет мне понять "сортировку слияния k-Way" очень хорошо.

Мне нужно хорошее объяснение, что делать, чтобы я мог взять его оттуда и сделать это сам.

Как я уже сказал, Я понимаю 2-Way, так как мне перейти к сортировке слияния K-Way? Как реализовать K-way.

спасибо помощь.

редактировать

* * Я прочитал сообщение http://bchalk.com/work/view/k_way_merge_sort этот BinaryHeap должен использоваться для реализации слияния k-Way. Это так или есть другие способы?

** Как разделить мой список на K? Есть ли особый способ сделать это?

2 ответов


, когда k > 2, ведущие элементы из каждого из входных потоков обычно хранятся в структуре minheap. Это позволяет легко найти в mininum n-значений, чтобы вытащить это значение из кучи и вставить значение замены из соответствующего входного потока.

куча делает O(lg2 k) сравнения для каждой вставки, поэтому общая работа для слияния k-way n элементов равна n * lg2(k).

Eventhough вы спросили о C# и Java, вы можете узнать, как это сделать глядя на стандартный код библиотеки Python для слияния k-way:http://hg.python.org/cpython/file/2.7/Lib/heapq.py#l323

чтобы ответить на ваш другой вопрос, нет специального способа разделить ваш список на K групп. Просто взять первые n/k элементов в первом массиве, следующие n/k элементов в следующую и т. д. Сортируйте каждый массив, а затем объединяйте их, используя кучи, как указано выше.


вы всегда можете думать о слиянии k-way как о серии двухсторонних слияний, то есть сделать двустороннее слияние с результатом первого и второго, и третьего: Merge(Merge(L1, L2), L3) и так далее. Еще быстрее было бы разделить его вдвое:Merge(Merge(L1, L2), Merge(L3, L4)). Как вы можете видеть, для сортировки k-way вам понадобится какой-то цикл (рекурсия).