Объясните, что происходит в части кода - C#
Формулировка задачи:
Алгоритм сортировки простым слиянием
Шаг 1. Исходный файл A разбивается на два вспомогательных файла B и C.
Шаг 2. Вспомогательные файлы B и C сливаются в файл A, при этом одиночные элементы образуют упорядоченные пары.
Шаг 3. Полученный файл A вновь обрабатывается, как указано в шагах 1 и 2. При этом упорядоченные пары переходят в упорядоченные четверки.
Шаг 4. Повторяя шаги, сливаем четверки в восьмерки и т. д., каждый раз удваивая длину слитых последовательностей до тех пор, пока не будет упорядочен целиком весь файл (как на фото)
Весь код
Подскажите , что происходит в этой части кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Файловая_сортировка
{
class Program
{
public static void generator(int n)
{
StreamWriter sw1 = new StreamWriter("A.txt");
Random rnd = new Random();
for (int i = 0; i < n-1; i++)
{
sw1.WriteLine(rnd.Next(-100,100));
};
sw1.Write(rnd.Next(-100,100));
sw1.Close();
}
public static void razdel(int p, int n)
{
StreamReader sr1 = new StreamReader("A.txt");
StreamWriter sw2 = new StreamWriter("B.txt");
StreamWriter sw3 = new StreamWriter("C.txt");
for (int i = 0; i < n; i++)
{
string Value = sr1.ReadLine();
if ((i / p) % 2 == 0)
sw2.WriteLine(Value);
else
sw3.WriteLine(Value);
};
sr1.Close();
sw2.Close();
sw3.Close();
}
public static void sliyanie(int p, int n)
{
int x, y;//считываемые x-A y-C числа
int c, d;//индексы
int p1=p, p2;//длинна отрезка
int o; //для корректной обработки последнего захода
StreamWriter sw1 = new StreamWriter("A.txt");
StreamReader sr2 = new StreamReader("B.txt");
StreamReader sr3 = new StreamReader("C.txt");
int i = 0;
while (sr3.EndOfStream == false) // если не пустой
{
x = Int32.Parse(sr2.ReadLine());
y = Int32.Parse(sr3.ReadLine());
c = 0;
d = 0;
if ((i == n / (2 * p)) && (n % (2 * p)!= 0))
{ o = n % (2 * p); p2=o%p;}
else
{ o = p * 2; p2 = p; }
do
{
if ((x < y) && (c < p1))
{
sw1.WriteLine(x);
c++;
if((c < p1)&&(sr2.EndOfStream==false))
x = Int32.Parse(sr2.ReadLine());
}
else
if (d < p2)
{
sw1.WriteLine(y);
d++;
if((d<p2)&&(sr3.EndOfStream==false))
y = Int32.Parse(sr3.ReadLine());
}
else
{
sw1.WriteLine(x);
c++;
if((c<p1)&&(sr2.EndOfStream==false))
x = Int32.Parse(sr2.ReadLine());
}
} while ((c + d) != o);
i++;
}
while (sr2.EndOfStream == false)
sw1.WriteLine(Int32.Parse(sr2.ReadLine()));
sw1.Close();
sr2.Close();
sr3.Close();
}
static void Main(string[] args)
{
int n=20;
generator(n);
for (int p = 1; p < n; p*=2)
{
razdel(p, n);
sliyanie(p, n);
}
}
}
}if ((i == n / (2 * p)) && (n % (2 * p)!= 0))
{ o = n % (2 * p); p2=o%p;}
else
{ o = p * 2; p2 = p; }Решение задачи: «Объясните, что происходит в части кода»
textual
Листинг программы
if ((i == n / (2 * p)) // если i == n / (2 * p)
&& (n % (2 * p)!= 0)) // И n % (2 * p) != 0) - остаток от деления n на (2 * p) не равен нулю
{ // тогда
o = n % (2 * p); // о присваивается остаток от деления n на (2 * p)
p2 = o % p; // о присваивается остаток от деления o на p
}
else // иначе ... дальше все должно быть понятно
{
o = p * 2;
p2 = p;
}