Example #1
0
        private void ThreadProc(Object stateInfo)
        {
            ParallelEntity pe = stateInfo as ParallelEntity;

            lock (pe)
            {
                pe.Status = ParallelSort <T> .Status.Running;

                Array.Sort(pe.Array, pe.Comparer);

                pe.Status = ParallelSort <T> .Status.Finish;
            }
        }
Example #2
0
        public void Sort(T[] array, IComparer <T> comparer)
        {
            //Calculate process count
            int processorCount = Environment.ProcessorCount;

            //If array.Length too short, do not use Parallel sort
            if (processorCount == 1 || array.Length < processorCount)
            {
                Array.Sort(array, comparer);
                return;
            }

            //Split array
            ParallelEntity[] partArray = new ParallelEntity[processorCount];

            int remain  = array.Length;
            int partLen = array.Length / processorCount;

            //Copy data to splited array
            for (int i = 0; i < processorCount; i++)
            {
                if (i == processorCount - 1)
                {
                    partArray[i] = new ParallelEntity(Status.Idle, new T[remain], comparer);
                }
                else
                {
                    partArray[i] = new ParallelEntity(Status.Idle, new T[partLen], comparer);

                    remain -= partLen;
                }

                Array.Copy(array, i * partLen, partArray[i].Array, 0, partArray[i].Array.Length);
            }

            //Parallel sort
            for (int i = 0; i < processorCount - 1; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), partArray[i]);
            }

            ThreadProc(partArray[processorCount - 1]);

            //Wait all threads finish
            for (int i = 0; i < processorCount; i++)
            {
                while (true)
                {
                    lock (partArray[i])
                    {
                        if (partArray[i].Status == ParallelSort <T> .Status.Finish)
                        {
                            break;
                        }
                    }

                    Thread.Sleep(0);
                }
            }

            //Merge sort
            MergeSort <T> mergeSort = new MergeSort <T>();

            List <T[]> source = new List <T[]>(processorCount);

            foreach (ParallelEntity pe in partArray)
            {
                source.Add(pe.Array);
            }

            mergeSort.Sort(array, source, comparer);
        }