Объясните, что происходит в части кода - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д