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