Advertisement
Guest User

Untitled

a guest
Nov 19th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.53 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Linq;
  4. using System.Collections.Generic;
  5.  
  6. namespace TestNums
  7. {
  8.     class Program
  9.     {
  10.         //метод обмена элементов
  11.         static void Swap(ref int e1, ref int e2)
  12.         {
  13.             var temp = e1;
  14.             e1 = e2;
  15.             e2 = temp;
  16.         }
  17.  
  18.         //сортировка пузырьком
  19.         static int[] BubbleSort(int[] array)
  20.         {
  21.             var len = array.Length;
  22.             for (var i = 1; i < len; i++)
  23.             {
  24.                 for (var j = 0; j < len - i; j++)
  25.                 {
  26.                     if (array[j] > array[j + 1])
  27.                     {
  28.                         Swap(ref array[j], ref array[j + 1]);
  29.                     }
  30.                 }
  31.             }
  32.  
  33.             return array;
  34.         }
  35.  
  36.         //сортировка перемешиванием
  37.         static int[] ShakerSort(int[] array)
  38.         {
  39.             for (var i = 0; i < array.Length / 2; i++)
  40.             {
  41.                 var swapFlag = false;
  42.                 //проход слева направо
  43.                 for (var j = i; j < array.Length - i - 1; j++)
  44.                 {
  45.                     if (array[j] > array[j + 1])
  46.                     {
  47.                         Swap(ref array[j], ref array[j + 1]);
  48.                         swapFlag = true;
  49.                     }
  50.                 }
  51.  
  52.                 //проход справа налево
  53.                 for (var j = array.Length - 2 - i; j > i; j--)
  54.                 {
  55.                     if (array[j - 1] > array[j])
  56.                     {
  57.                         Swap(ref array[j - 1], ref array[j]);
  58.                         swapFlag = true;
  59.                     }
  60.                 }
  61.  
  62.                 //если обменов не было выходим
  63.                 if (!swapFlag)
  64.                 {
  65.                     break;
  66.                 }
  67.             }
  68.  
  69.             return array;
  70.         }
  71.  
  72.  
  73.         //сортировка вставками
  74.         static int[] InsertionSort(int[] array)
  75.         {
  76.             for (var i = 1; i < array.Length; i++)
  77.             {
  78.                 var key = array[i];
  79.                 var j = i;
  80.                 while ((j > 1) && (array[j - 1] > key))
  81.                 {
  82.                     Swap(ref array[j - 1], ref array[j]);
  83.                     j--;
  84.                 }
  85.  
  86.                 array[j] = key;
  87.             }
  88.  
  89.             return array;
  90.         }
  91.  
  92.  
  93.         //сортировка по частям
  94.         static int[] StoogeSort(int[] array, int startIndex, int endIndex)
  95.         {
  96.             if (array[startIndex] > array[endIndex])
  97.                 Swap(ref array[startIndex], ref array[endIndex]);
  98.  
  99.             if (endIndex - startIndex > 1)
  100.             {
  101.                 var len = (endIndex - startIndex + 1) / 3;
  102.                 StoogeSort(array, startIndex, endIndex - len);
  103.                 StoogeSort(array, startIndex + len, endIndex);
  104.                 StoogeSort(array, startIndex, endIndex - len);
  105.             }
  106.  
  107.             return array;
  108.         }
  109.  
  110.         //Сортировка Шелла
  111.         static int[] ShellSort(int[] array)
  112.         {
  113.             //расстояние между элементами, которые сравниваются
  114.             var d = array.Length / 2;
  115.             while (d >= 1)
  116.             {
  117.                 for (var i = d; i < array.Length; i++)
  118.                 {
  119.                     var j = i;
  120.                     while (j >= d && array[j - d] > array[j])
  121.                     {
  122.                         Swap(ref array[j], ref array[j - d]);
  123.                         j -= d;
  124.                     }
  125.                 }
  126.  
  127.                 d /= 2;
  128.             }
  129.  
  130.             return array;
  131.         }
  132.  
  133.         //Поразрядная сортировка, int length - исключает последнее!!!
  134.         public static int[] MsdSorting(int[] arr, int range, int length)
  135.         {
  136.             var lists = new ArrayList[range];
  137.             for (var i = 0; i < range; ++i)
  138.                 lists[i] = new ArrayList();
  139.  
  140.             for (var step = 0; step < length; ++step)
  141.             {
  142.                 //распределение по спискам
  143.                 foreach (var t in arr)
  144.                 {
  145.                     var temp = t % (int) Math.Pow(range, step + 1) /
  146.                                (int) Math.Pow(range, step);
  147.                     lists[temp].Add(t);
  148.                 }
  149.  
  150.                 //сборка
  151.                 var k = 0;
  152.                 for (var i = 0; i < range; ++i)
  153.                     for (var j = 0; j < lists[i].Count; ++j)
  154.                         arr[k++] = (int) lists[i][j];
  155.  
  156.                 for (var i = 0; i < range; ++i)
  157.                     lists[i].Clear();
  158.             }
  159.  
  160.             return arr;
  161.         }
  162.  
  163.         public static int[] GetNewArray()
  164.         {
  165.             int numElements = 10000;
  166.             Random rand = new Random();
  167.             int[] source = { };
  168.             for (int i = 0; i < numElements; ++i)
  169.             {
  170.                 Array.Resize(ref source, source.Length + 1);
  171.                 source[i] = rand.Next(0, 1000);
  172.             }
  173.  
  174.             return source;
  175.         }
  176.  
  177.  
  178.         private static TimeSpan TestSorting(int num, Func<int[], int[]> func)
  179.         {
  180.             var res = new List<TimeSpan>();
  181.             for (int i = 0; i < num; ++i)
  182.             {
  183.                 var source = GetNewArray();
  184.  
  185.                 DateTime test = DateTime.Now;
  186.                 var resultArray = func(source);
  187.                 var span = DateTime.Now - test;
  188.                 res.Add(span);
  189.             }
  190.  
  191.             return res.Aggregate(TimeSpan.Zero, (span, timeSpan) => span + timeSpan) / num;
  192.         }
  193.  
  194.        
  195.         private static TimeSpan TestMsdSorting(int num, Func<int[], int, int, int[]> func)
  196.         {
  197.             var res = new List<TimeSpan>();
  198.             for (int i = 0; i < num; ++i)
  199.             {
  200.                 var source = GetNewArray();
  201.                 var len = source.Length;
  202.                 DateTime test = DateTime.Now;
  203.                 func(source, 1000, 4);
  204.                 var span = DateTime.Now - test;
  205.                 res.Add(span);
  206.             }
  207.  
  208.             return res.Aggregate(TimeSpan.Zero, (span, timeSpan) => span + timeSpan) / num;
  209.         }
  210.  
  211.        
  212.  
  213.         static void Main(string[] args)
  214.         {
  215. //            Console.WriteLine($"Bubble sort done - mean: {TestSorting(10, BubbleSort)}");
  216. //            Console.WriteLine($"Shaker sort done - mean: {TestSorting(10, ShakerSort)}");
  217. //            Console.WriteLine($"Insertion sort done - mean: {TestSorting(10, InsertionSort)}");
  218. //            Console.WriteLine($"Shell Sort - mean: {TestSorting(1000, ShellSort)}");
  219. //            Console.WriteLine($"Bit(Radix) Sort - mean: {TestMsdSorting(1000, MsdSorting)}");
  220. //
  221. //
  222. //            var test66 = GetNewArray();
  223. //            DateTime test6 = DateTime.Now;
  224. //            var sharp = test66.OrderBy(x => x).ToArray();
  225. //            var testRes6 = DateTime.Now - test6;
  226. //            Console.WriteLine($"OrderBy sort - {testRes6}");
  227.            
  228.             var t = GetNewArray();
  229.             var temp = new int[10000];
  230.             t.CopyTo(temp, 0);
  231.            
  232.             var test = DateTime.Now;
  233.             MsdSorting(t,1000,1);
  234.             Console.WriteLine($"Bit(Radix) Sort>>>: {DateTime.Now - test}");
  235. //            Console.WriteLine(string.Join(",",t));
  236. //            Console.WriteLine(string.Join(",",temp.OrderBy(x=>x)));
  237.  
  238.             var testing = temp.OrderBy(x => x).ToArray();
  239.  
  240.             bool res = t.SequenceEqual(testing);
  241.             Console.WriteLine(res);
  242.             if (!res)
  243.                 for (int i = 0; i < 10000; i++)
  244.                 {
  245.                     if (t[i] != testing[i])
  246.                         Console.WriteLine($"Num {i}: t={t[i]}  <>  testing={testing[i]}");
  247.                 }
  248.            
  249. //
  250. //            var dict = new Dictionary<int, TimeSpan>();
  251. //
  252. //            for (var k = 1; k <= 10000; ++k)
  253. //            {
  254. //                var t = GetNewArray();
  255. //                var len = t.Length;
  256. //                var test = DateTime.Now;
  257. //                MsdSorting(t,len,2);
  258. //                dict.Add(k,DateTime.Now - test);
  259. //                Console.WriteLine($"Bit Sort - {k} lists: {DateTime.Now - test}");
  260. //            }
  261. //
  262. //            var min = dict.Values.Min();
  263. //            Console.WriteLine(dict.First(x => x.Value == min));
  264.         }
  265.     }
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement