Сортировка в потоках Task - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! По заданию мне нужно отсортировать массив двумя алгоритмами сортировки и вывести время их работы, сделать все это нужно с использованием потоков Task. Для замера времени использовал Stopwathc, но преподаватель отказался принимать и сказал, что нужно вернуть время работы результатом работы Task, без использования переменных, т.к. по его словам, Task возвращает численное значение. Подскажите пожалуйста, как это можно реализовать? Вот исходный код. Файл - program.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();
        }
    }
}
Файл - Sortings.cs
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(() =>
{
  ...
});

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5