Sleepsort
Читал на «хабре» про алгоритм sleepsort и благополучно забыл про него. Сегодня решил посмотреть, как его можно реализовать на C#.
Первой идеей было использовать Parallel.ForEach, но, как выяснилось, количество активных потоков в нём регулируется количеством ядер процессора и фазой Луны — стартуют они не одновременно, а ждут завершения предыдущих. Поэтому сделал через Thread:
using System;
using System.Threading;
class SleepSort
{
    static void ThreadWorker(object number)
    {
        Thread.Sleep(100 * (int)number);
        Console.WriteLine(number);
    }
    static public void Sort(int[] numbers)
    {
        foreach (int number in numbers)
        {
            new Thread(ThreadWorker).Start(number);
        }
    }
}
class Program
{
    static void Main()
    {
        SleepSort.Sort(new int[] { 7, 9, 8, 10, 6, 5, 1, 3, 2, 4 });
        Console.ReadKey(true);
    }
}
Умножение на 100 при задержке сделано неспроста — точности при отдельных миллисекундах не получается и потоки начинают завершаться в абы каком порядке. Конечно, практического применения у алгоритма нет, но выгядит весело =)
Комментариев нет