Advertisement
xxeell

Stalin_Array_comm

Nov 4th, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.55 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Diagnostics;
  6.  
  7. namespace StalinArray
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             bool debug_flag = false;               // Флаг для вывода массива
  14.             Stopwatch timer = new Stopwatch();     // Для замера времени выполнения
  15.             List<long> timeres = new List<long>(); // Для хранения результатов замера
  16.             Random r = new Random();
  17.  
  18.             const int lngth = 1000;
  19.             int[] a = new int[lngth];
  20.  
  21.             timer.Start();
  22.             for (int i = 0; i < lngth; i++) a[i] = i + 1;
  23.             timer.Stop();
  24.             timeres.Add(timer.ElapsedMilliseconds);
  25.             timer.Reset();
  26.  
  27.             if (debug_flag)
  28.             {
  29.                 foreach (int i in a) Console.Write("{0} ", i);
  30.                 Console.WriteLine();
  31.             }
  32.      
  33.             /*
  34.              * Можно любое число, но желательно, чтобы оно было
  35.              * больше длинны массива, либо равно ей.
  36.              * Благодаря этому массив будет более "перемешан".
  37.              */
  38.             const int magic_count = lngth;
  39.             /*
  40.             Console.ForegroundColor = ConsoleColor.Green;
  41.             Console.WriteLine("Перемешивание...");  
  42.             Console.WriteLine("{0} замен...", magic_count);
  43.             Console.ForegroundColor = ConsoleColor.Gray;    
  44.             */
  45.             timer.Start();
  46.             int t, i1, i2;
  47.             /*
  48.              * Простейшее перемешивание.
  49.              * 2 случайно выбранных элемента массива меняются местами.
  50.              */
  51.             for (int i = 0; i < magic_count; i++)
  52.             {
  53.                 i1 = r.Next(0, lngth);
  54.                 i2 = r.Next(0, lngth);
  55.  
  56.                 t = a[i1];
  57.                 a[i1] = a[i2];
  58.                 a[i2] = t;
  59.             }
  60.             timer.Stop();
  61.             timeres.Add(timer.ElapsedMilliseconds);
  62.             timer.Reset();
  63.  
  64.             if (debug_flag)
  65.             {
  66.                 foreach (int i in a) Console.Write("{0} ", i);
  67.                 Console.WriteLine();
  68.             }
  69.             /*
  70.             Console.ForegroundColor = ConsoleColor.Green;
  71.             Console.WriteLine("Сдвиги...");          
  72.             Console.ForegroundColor = ConsoleColor.Gray;
  73.             */
  74.             List<List<int>> tarr = new List<List<int>>();
  75.             tarr.Add(new List<int>(a));
  76.  
  77.             timer.Start();
  78.             /*
  79.              * Первая важная магия процесса.
  80.              * Создается двумерный массив, 0-евой итерацией которого
  81.              * становится изначальный перемешанный массив.
  82.              * Совершается пробежка по всему массиву.
  83.              * Если число меньше предыдущего, то оно "выталкивается" на
  84.              * следующую итерацию, удаляясь в этой.
  85.              */
  86.             for (int i = 0; i < tarr.Count; i++)
  87.             {
  88.                 for (int q = 1; q < tarr[i].Count; q++)
  89.                 {
  90.                     if (tarr[i][q] < tarr[i][q - 1])
  91.                     {
  92.                         if (i + 1 >= tarr.Count) tarr.Add(new List<int>());
  93.  
  94.                         tarr[i + 1].Add(tarr[i][q]);
  95.                         tarr[i].RemoveAt(q);
  96.                         q--;
  97.                     }
  98.                 }
  99.             }
  100.             timer.Stop();
  101.             timeres.Add(timer.ElapsedMilliseconds);
  102.             timer.Reset();
  103.  
  104.             if (debug_flag)
  105.             {
  106.                 for (int i = 0; i < tarr.Count; i++)
  107.                 {
  108.                     for (int q = 0; q < tarr[i].Count; q++)
  109.                     {
  110.                         Console.Write("{0} ", tarr[i][q]);
  111.                     }
  112.                     Console.WriteLine();
  113.                 }
  114.             }
  115.             /*
  116.             Console.ForegroundColor = ConsoleColor.Green;
  117.             Console.WriteLine("Волшебная магия...");
  118.             Console.ForegroundColor = ConsoleColor.Gray;
  119.             */
  120.             List<int> res = new List<int>();
  121.             int ti;
  122.             /*
  123.              * Вторая часть магии.
  124.              * Пока в массиве есть значения, происходит пробежка
  125.              * по 0-евым лементов всех вложенных массивов и выбирается
  126.              * наименьшый из всех вариантов, который добавляется в
  127.              * массив результата и удалятся из двумерного массива "сдвигов".
  128.              * Регулярные проверки на "пустоту" массивов с последующим удалением
  129.              * оберегают от ошибок и исключений.
  130.              */
  131.             timer.Start();
  132.             while (tarr.Count > 0)
  133.             {
  134.                 if (tarr[0].Count < 1)
  135.                 {
  136.                     tarr.RemoveAt(0);
  137.                     continue;
  138.                 }
  139.  
  140.                 ti = 0;
  141.                 for (int i = 1; i < tarr.Count; i++)
  142.                 {
  143.                     if(tarr[i].Count < 1)
  144.                     {
  145.                         tarr.RemoveAt(i);
  146.                         i--;
  147.                         continue;
  148.                     }
  149.  
  150.                     if (tarr[ti][0] > tarr[i][0]) ti = i;
  151.                 }
  152.  
  153.                 res.Add(tarr[ti][0]);
  154.                 tarr[ti].RemoveAt(0);
  155.             }
  156.             timer.Stop();
  157.             timeres.Add(timer.ElapsedMilliseconds);
  158.             timer.Reset();
  159.  
  160.             if (debug_flag)
  161.             {
  162.                 foreach (int i in res) Console.Write("{0} ", i);
  163.             }
  164.              
  165.             Console.Write("\n-----------------------------\n");
  166.             Console.WriteLine("TimeResults:");
  167.             for (int i = 0; i < timeres.Count; i++)
  168.             {
  169.                 Console.WriteLine("{0} - {1}", i, timeres[i]);
  170.             }
  171.  
  172.             Console.ReadKey();
  173.         }
  174.     }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement