Описание кода

Что выполняет эта часть кода? Ни как не могу разобраться
Здесь происходит метод каскадного слияния, а вот что именно тут я не понимаю

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;
}

)))
В этой теме похоже уже портянка поменьше, следовательно меньше вопросов чем здесь
Так что именно не понятно в коде?