Сортировка в потоках Task - C#
Формулировка задачи:
Здравствуйте!
По заданию мне нужно отсортировать массив двумя алгоритмами сортировки и вывести время их работы, сделать все это нужно с использованием потоков Task.
Для замера времени использовал Stopwathc, но преподаватель отказался принимать и сказал, что нужно вернуть время работы результатом работы Task, без использования переменных, т.к. по его словам, Task возвращает численное значение.
Подскажите пожалуйста, как это можно реализовать?
Вот исходный код.
Файл - program.cs
Файл - Sortings.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Diagnostics; namespace Lab3Sortings { class Program { static void Main(string[] args) { int[] intMas = new int[500000]; Random rnd = new Random(); Task[] threadMas = new Task[2]; for (int i = 0; i < 50; i++) { intMas[i] = rnd.Next(0, 1000000); } Console.WriteLine("*****СРАВНЕНИЕ ДВУХ ВИДОВ СОРТИРОВКИ*****"); Console.WriteLine("1) Быстрая сортировка"); Console.WriteLine("2) Сортировка прямым включением"); Console.WriteLine(); threadMas[0] = new Task(delegate() { TimeSpan[] ts = new TimeSpan[10]; TimeSpan sum = TimeSpan.Zero; for (int iter = 0; iter < ts.Length; iter++) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Sortings.quickSort(intMas, 0, intMas.Length - 1); stopWatch.Stop(); sum += stopWatch.Elapsed; } TimeSpan avg = new TimeSpan(sum.Ticks / ts.Length); Console.WriteLine("Быстрая сортировка: {0} ", avg); }); threadMas[1] = new Task(delegate() { TimeSpan[] ts = new TimeSpan[10]; TimeSpan sum = TimeSpan.Zero; for (int iter = 0; iter < ts.Length; iter++) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Sortings.inclusionSort(intMas); stopWatch.Stop(); sum += stopWatch.Elapsed; } TimeSpan avg = new TimeSpan(sum.Ticks / ts.Length); Console.WriteLine("Сортировка прямым включением: {0}", avg); }); threadMas[0].Start(); threadMas[1].Start(); Console.WriteLine("Ожидание завершения работы потоков..."); Task.WaitAll(threadMas); Console.WriteLine("Работа завершена"); Console.ReadKey(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Lab3Sortings { public static class Sortings { // 1) быстрая сортировка public static void quickSort(int[] a, int l, int r) { int temp; int x = a[l + (r - l) / 2]; //запись эквивалентна (l+r)/2, //но не вызввает переполнения на больших данных int i = l; int j = r; //код в while обычно выносят в процедуру particle while (i <= j) { while (a[i] < x) i++; while (a[j] > x) j--; if (i <= j) { temp = a[i]; a[i] = a[j]; a[j] = temp; i++; j--; } } if (i < r) quickSort(a, i, r); if (l < j) quickSort(a, l, j); } // 2) Сортировка прямым включением public static void inclusionSort(int[] a) { for (int i = 1; i < a.Length; i++) { int tmp = a[i]; int j; for (j = i - 1; j >= 0 && a[j] > tmp; j--) a[j + 1] = a[j]; a[j + 1] = tmp; } } } }
Решение задачи: «Сортировка в потоках Task»
textual
Листинг программы
new Task(() => { ... });
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д