Описание кода, метод каскадного слияния

Помогите описать код. Не совсем понимаю что тут написано
Если что здесь происходит метод каскадного слияния

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool fillFile(string FileName, int Number, int min = -100, int max = 100);
bool tmpFiles(string FileName,const vector<int>& Files,const vector<string>& FN);
int fileSeries( vector<int>& Files, int level);
bool cascadeSort(string FileOut, const vector<string>&FN,int NumberFile,int level);
int main()
{
	setlocale(0,"");
	int NumberFiles = 6;
	vector <int> Files(NumberFiles);
	vector<string>FilesName(NumberFiles);
	for (int i = 0;i < NumberFiles;i++)
		FilesName[i] = "tmp" + to_string(i) + ".txt";
	int min=0, max=0,level=0;
	cout << "Введите границы диапазона для случайных значений\n";
	cout << "min="; cin >> min;
	cout << "max="; cin >> max;
	if (min > max) swap(min, max);
	cout << "Введите уровень для определения кол-ва данных в файле:\n";
	cin >> level;
	if (level < 0) level = abs(level);
	int count = fileSeries(Files, level);
	if (!fillFile("input.txt", count, min, max))
	{
		cout << "Файл \"input.txt\" успешно сформирован.\nОбъем - "<<count<<" значений\n";
		if (!tmpFiles("input.txt", Files, FilesName))
			cout << "Данные разбиты на части\n";
		else
		{
			cout << "Не удалось сформировать файлы для каскадной сортировки\n";
		    return -1;

		}
		if (!cascadeSort("output.txt", FilesName,NumberFiles, level))
			cout <<"Данные отсортированы. Результат в файле \"output.txt\"\n";
		else
		{
			cout << "Не удалось выполнить сортировку\n";
		    return -1;
		}
	}
	else
	{
		cout << "Не удалось создать файл исходных данных\n";
		return -1;
	}
	return 0;
}

int fileSeries(vector<int>& Files, int level)
{
	Files[0] = 1;
	for (int j=1;j<=level;j++)
	{
		reverse(Files.begin(), Files.end() - 1);
			for (int i = Files.size() - 3; i >= 0;i--)
			{
				Files[i] += Files[i + 1];
			}
	}
	int result = 0;
	for (vector<int>::iterator iter = Files.begin();iter < Files.end() - 1;iter++)
		result += *iter;
	
	return result;

}


bool fillFile(std::string FileName, int Number, int min, int max)
{
	std::ofstream FileIn(FileName);
	if (!FileIn.is_open())
	{
		return -1;
	}
	srand(time(0));
	for (int i = 0; i < Number;i++)
	{
		FileIn << (min + rand() % (max - min + 1)) << " ";
	}
	FileIn.close();
	return 0;
}
bool tmpFiles(string FileName, const vector <int>& Files, const vector<string>& FN)
{
	fstream FileIn,FileTmp;
	FileIn.open(FileName, ios_base::in);
	if (FileIn.is_open())
	{
		for (int i = 0;i < Files.size();i++)
		{
			
			FileTmp.open(FN[i], std::ios_base::out);
			for (int j = 0;j < Files[i];j++)
			{
				int tmp;
				FileTmp << " ";FileIn >> tmp;
				FileTmp << tmp;
			}
			FileTmp.close();
		}
		FileIn.close();
		return 0;
	}
	else { return -1; }

}
bool cascadeSort(string FileOut, const vector<string>& FN,int NumberFiles, int level)
{
	std::vector<int> Series(NumberFiles);
	std::vector<int> TAPE(NumberFiles);
	std::vector<std::fstream> FileTmp(NumberFiles);
	vector<int> TmpMerge;
	for (int i = 0;i < NumberFiles - 1;i++)
	{
		Series[i]= 1;
		TAPE[i] = i;
	}
    TAPE[NumberFiles-1] = NumberFiles-1;
	while (level != 0)
	{
		for (int i = 0;i < NumberFiles - 1;i++)
		{
			
			FileTmp[TAPE[i]].open(FN[TAPE[i]], std::ios_base::in);

		}
		int p = NumberFiles - 1;

		FileTmp[TAPE[p]].open(FN[TAPE[p]], std::ios_base::out);
		FileTmp[TAPE[p]].clear();
			

		for (;p >= 1;p--)
		{
			
				while (!FileTmp[TAPE[p-1]].eof())
				{
					for (int i = 0;i < p;i++)
					{
						for (int j = 0;j < Series[TAPE[i]];j++)
						{
							int tmp;
							FileTmp[TAPE[i]] >> tmp;
							TmpMerge.push_back(tmp);
						}

					}
					
					sort(TmpMerge.begin(), TmpMerge.end());
					for (vector<int>::iterator iter = TmpMerge.begin();iter < TmpMerge.end();iter++)
					{
						FileTmp[TAPE[p]] <<" "<< *iter;
				//		cout <<" "<< *iter;
					}
				//	cout << endl;
					TmpMerge.clear();
					
				}
				FileTmp[TAPE[p - 1]].close();
				
				int sum = 0;
				for (int i=0;i<p;i++)
					sum += Series[TAPE[i]];
				Series[TAPE[p]] = sum;
				FileTmp[TAPE[p]].close();
				FileTmp[TAPE[p - 1]].open(FN[TAPE[p-1]], std::ios_base::out);

			

		}
		reverse(TAPE.begin(), TAPE.end());
		level--;
	}
	remove(FileOut.c_str());
	rename(FN[TAPE[0]].c_str(), FileOut.c_str());
	for (int i = 0;i < NumberFiles;i++)
	{
		remove(FN[TAPE[i]].c_str());
	}
	return 0;
}

Что именно непонятно?

Вряд ли кто-то будет писать комменты к каждой строке )

да не обязательно каждую строку, хотя бы в цело что в какой функции выполняется

Так основная функция тут одна:

В остальных

просто генерация файлов с исходными данными.

Для чего нужна fileSeries и что такое

я не понял.