@EAVol

Как верно реализовать внешнюю сортировку естественным слиянием с порогом?

Здравствуйте, форумчане! Задали мне вот такую задачку: реализовать внешнюю сортировку естественным слиянием. Есть примерное начало работы программы: случайно генерируется, например, 10К структур имеющих 5 полей (2 строковых и 3 числовых). Затем, полученный массив записывается в файл (test.txt). Далее генерируется случайное число до 1000 - назовем его Z. Затем нужно переписать Z строк основного файла (test.txt) в другой файл (каждый следующий файл новый), предварительно отсортировав по возрастанию. Повторяется генерация числа, сортировка и запись до тех пор, пока не перепишем все 10К структур. Затем нужно начать процедуру слияния файлов. С Merge вроде всё ясно - простое слияние 2-х массивов. Но не могу понять, как описать Split. Подскажите, пожалуйста.
  • Вопрос задан
  • 3761 просмотр
Пригласить эксперта
Ответы на вопрос 2
microphone
@microphone
Сломалось - читай логи!
а сортируется по возрастанию структуры или строки или внутри строк элементы массива?
размерности заданы?
если сортировки, то тут АВЛ дерево скорее всего подойдет.
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Не очень понятно, зачем здесь Z. Если 1000 структур помещается в памяти, и мы их можем отсортировать, то казалось бы - читаем из файла 10 раз по 1000 структур (по порядку, за один проход), каждый раз структуры сортируем и в отсортированном порядке помещаем в новый файл. Всего получается 10 файлов. Дальше - обычный merge. Кстати, слить можно сразу все 10 файлов, если их можно открыть одновременно. Если нет - сливаем два самых маленьких файла, пока не останется один (выгодно, чтобы сливаемые файлы были примерно одинакового размера - как группы символов в коде Хаффмана).
Возможно, Z придумали, чтобы файлы были не совсем одинаковыми, чтобы алгоритм не закладывался на одинаковость размера. Но тогда лучше было бы, например, "случайное число от 500 до 1000". В любом случае, если брать не максимум, то алгоритму только хуже.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы