- режим сортировки (
-a
или-d
), необязательный, по умолчанию сортируем по возрастанию; - тип данных (
-s
или-i
), обязательный; - имя выходного файла, обязательное;
- остальные параметры – имена входных файлов, не менее одного.
Примеры запуска из командной строки для Windows (для приложенного файла "merge_sort.jar"):
java -jar merge_sort.jar -i -a out.txt in1.txt
(для целых чисел по возрастанию)java -jar merge_sort.jar -s out.txt in1.txt in2.txt in3.txt
(для строк по возрастанию)java -jar merge_sort.jar -d -s out.txt in1.txt in2.txt
(для строк по убыванию)
- Читатем входной файл с самого начала.
- Считываем число записей (по умолчанию 100), заданное в maxLinesInMemoryBuffer (или меньше, если число оставшихся в файле записей(countOfLinesInTheFile) меньше, чем maxLinesInMemoryBuffer) из файла и сохраняем их во временном буфере.
- Сортируем числа в буфере методом "пузырька".
- Создаем временный файл на диске и записываем отсортированные номера из шага 3 в этот временный файл. Сохраняем имя временного файла.
- Повторяем шаги 2-4, пока все записи из входного файла не будут прочитаны, отсортированы и записаны во временные файлы.
На данный момент у нас есть куски чисел размера maxLinesInMemoryBuffer (или меньше), отсортированные и сохраненные во временных файлах на диске. Нам нужно объединить все эти отсортированные файлы в один отсортированный файл. Применяем алгоритм сортировки слиянием, чтобы объединить числа из этих отсортированных файлов.
Новый файл на диске теперь содержит отсортированный список записей из всех входных файлов.
- Программа работает с файлами, данные в которых изначально не отсортированны. Первоначальная сортировка производится методом «пузырька». (Этот функционал реализован в классе "BubbleSort").
- Алгоритм устойчив к большим данным, поле maxLinesInMemoryBuffer принадлежащее классу FileSplitterForInt/FileSplitterForString определяет максимальное кол-во значений, которые будут взяты из входного файла за один проход, позже они сортируются и записываются во временный файл. (изначально maxLinesInMemoryBuffer == 100)
- Реализована обработка невалидных значений для целочисленных значений. Примеры:
В файле in1.txt обнаружен некорректный формат числового значения: "4." Производится попытка преобразования. Попытка преобразования прошла успешно. Новое значение: "4"
В файле in1.txt обнаружен некорректный формат числового значения: "j23" Производится попытка преобразования. Попытка преобразования прошла успешно. Новое значение: "23"
В файле in1.txt обнаружен некорректный формат числового значения: "s" Производится попытка преобразования. Не удалось выполнить преобразование.