Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2017, 07:42   #1
fr0st1k123
Пользователь
 
Регистрация: 28.09.2015
Сообщений: 53
По умолчанию Объясните, что происходит в части кода

Алгоритм сортировки простым слиянием
Шаг 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; }

Последний раз редактировалось fr0st1k123; 22.05.2017 в 12:27.
fr0st1k123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PASCAL-Объясните пошагово что происходит в этом цикле пожалуйста kanav2 Паскаль, Turbo Pascal, PascalABC.NET 1 17.03.2017 08:21
Помогите пожалуйста, объясните что происходит в каждой строчке программы. nason Помощь студентам 0 15.12.2015 19:22
объясните пожалуйста в коментариях что происходит в каждой строчке(С++Builder) Coca Colla Помощь студентам 6 13.05.2014 14:37
Не могу понять строку кода. Подскажите что тут происходит pompiduskus JavaScript, Ajax 9 06.04.2014 20:25