Я беру урок по Алгоритмам, и последние домашние задания действительно ставят меня в тупик. По сути, назначение состоит в том, чтобы реализовать версию сортировки слиянием, которая не выделяет столько временной памяти, как реализация в CLRS. Я должен сделать это, создав в начале только 1 временный массив и поместив в него все временные элементы при разделении и объединении.
Следует также отметить, что языком класса является Lua, что важно, поскольку единственными доступными структурами данных являются таблицы. Они похожи на карты Java в том, что они состоят из пар ключ-значение, но они похожи на массивы, в которых вам не нужно вставлять вещи парами - если вы вставляете только одну вещь, она рассматривается как значение, и ее ключ будет то, что его индекс будет в языке с реальными массивами. По крайней мере, я так понимаю, так как я новичок в Lua. Кроме того, все, что угодно, примитивы, строки, объекты и т. Д., Может быть ключом - даже разные типы в одной таблице.
Во всяком случае, 2 вещи, которые меня смущают:
Во-первых, ну, как это делается? Вы просто продолжаете переписывать временный массив с каждой рекурсией разделения и слияния?
Во-вторых, я действительно смущен инструкциями по выполнению домашних заданий (я провожу аудит класса бесплатно, поэтому не могу просить никого из сотрудников). Вот инструкции:
Напишите процедуру верхнего уровня merge_sort, которая принимает в качестве аргумента аргумент
Луч сортировать. Он должен объявить временный массив и затем вызвать merge_sort_1,
процедура из четырех аргументов: массив для сортировки, тот, который используется в качестве
пространство и начальные и конечные индексы, в которых этот вызов
merge_sort_1 должен работать.
Теперь напишите merge_sort_1, который вычисляет среднюю точку начала-конца
интервал, и делает рекурсивный вызов для себя для каждой половины. После этого это
вызовы слияния, чтобы объединить две половины.
Процедура слияния, которую вы пишете сейчас, будет функцией постоянной
массив и временный массив, начало, середина и конец.
Он поддерживает индекс во временном массиве и индексы i, j в каждом
(отсортировано) половина постоянного массива.
Нужно пройтись по временному массиву от начала до конца, копируя
значение либо из нижней половины постоянного массива, либо из
верхняя половина постоянного массива. Он выбирает значение в нижнем
половина, если это меньше или равно значению при j в верхней половине, и
авансы я. Это выбирает значение в j в верхней половине, если это меньше, чем
значение в нижней половине, и продвигается j.
После того, как одна часть постоянного массива будет израсходована, обязательно скопируйте остальные
другой части. В учебнике используется трюк с бесконечным значением ∞ для
не проверяйте, израсходована ли какая-либо часть Однако этот трюк сложен
подать заявку здесь, так как где бы вы положили?
Наконец, скопируйте все значения от начала до конца во временном массиве
вернуться к постоянному массиву.
Номер 2 сбивает с толку, потому что я понятия не имею, что должен делать merge_sort_1 и почему он должен отличаться от метода merge_sort. Я также не знаю, почему нужно передавать начальный и конечный индексы. На самом деле, может быть, я что-то неправильно понял, но инструкции звучат так, будто merge_sort_1 не выполняет никакой реальной работы.
Кроме того, все назначение сбивает с толку, потому что я не вижу в инструкциях, где деление делается на две половины исходного массива. Или я неправильно понял mergesort?
Надеюсь, у меня есть смысл. Спасибо всем!