Простой ответ - на этот вопрос нет простого ответа. Есть много ответов, большинство из которых довольно сложные - том 3 Кнута (для одного примера) отводит ему много места.
Одна вещь, которая становится очевидной при просмотре того, что было сделано, заключается в том, что вы действительно хотите минимизировать количество прогонов, которые вы создаете во время первоначальной сортировки, и максимизировать длину каждого из них. Чтобы сделать это, вы, как правило, хотите ввести в память столько данных, сколько можете уместить, но вместо того, чтобы просто отсортировать и записать их, вы хотите поместить их в кучу. Затем, когда вы записываете каждую запись, вы читаете IN другую запись.
Затем вы проверяете, будет ли эта запись сортироваться до или после записи, которую вы только что написали. Если вы хотите выполнить сортировку после этого, вставьте ее в свою кучу и продолжите. Если он сортируется раньше, вы вставляете его во вторую кучу.
Вы прекращаете добавлять записи в текущий прогон, когда первая куча полностью пуста, а ваша вторая куча занимает всю вашу память. В этот момент вы повторяете процесс, записывая новый прогон в новый файл.
Обычно это приводит к значительно более длительным промежуточным циклам на начальном этапе, поэтому объединение их - это значительно меньше работы. Предполагая, что входные записи расположены в случайном порядке, вы можете ожидать, что это приблизительно удвоит длину каждого прогона, но если входные данные даже частично отсортированы, это может использовать преимущества существующего порядка для увеличения длин прогонов.
Кроме того, я, конечно, не придумал этого - я, вероятно, впервые прочитал об этом в Кнуте, но, возможно, в Алгоритмы + Структуры данных = Программы (Никлаус Вирт) - оба обсуждают это. Кнут приписывает первую публикацию метода «Х. Сьюарду» в своей магистерской диссертации в Массачусетском технологическом институте в 1954 году. Если у вас есть второе издание Кнута, оно находится на странице 254 тома 3. У меня нет копии третьего издание, поэтому у меня нет номера страницы для этого.