Exemplo n.º 1
0
        private void BitonicSort(object AsyncState)
        {
            BitonicParameters parameters = (BitonicParameters)AsyncState;

            if (parameters.Length > 1)
            {
                if (parameters.Length > minimumLength)
                {
                    int    median = parameters.Length / 2;
                    Thread left   = new Thread(BitonicSort);
                    Thread right  = new Thread(BitonicSort);
                    left.Start(new BitonicParameters(parameters.Index, median, Ascending));
                    right.Start(new BitonicParameters(parameters.Index + median, median, Descending));
                    left.Join();
                    right.Join();
                }
                else
                {
                    int median = (parameters.Length / 2);
                    if (median > 1)
                    {
                        BitonicSort(new BitonicParameters(parameters.Index, median, Ascending));
                        BitonicSort(new BitonicParameters(parameters.Index, median, Ascending));
                    }
                }
                BitonicMerge(new BitonicParameters(parameters.Index, parameters.Length, parameters.Direction));
            }
        }
Exemplo n.º 2
0
        private void BitonicMerge(object AsyncState)
        {
            BitonicParameters parameters = (BitonicParameters)AsyncState;

            if (parameters.Length > 1)
            {
                if (parameters.Length > minimumLength)
                {
                    int median = (parameters.Length / 2);

                    for (int i = parameters.Index; i < (parameters.Index + median); i++)
                    {
                        Compare(i, (i + median), parameters.Direction);
                    }
                    Thread left  = new Thread(BitonicMerge);
                    Thread right = new Thread(BitonicMerge);
                    left.Start(new BitonicParameters(parameters.Index, median, parameters.Direction));
                    right.Start(new BitonicParameters(parameters.Index + median, median, parameters.Direction));
                    left.Join();
                    right.Join();
                }
                else
                {
                    int median = (parameters.Length / 2);

                    for (int i = parameters.Index; i < (parameters.Index + median); i++)
                    {
                        Compare(i, (i + median), parameters.Direction);
                    }
                    if (median > 1)
                    {
                        BitonicMerge(new BitonicParameters(parameters.Index, median, parameters.Direction));
                        BitonicMerge(new BitonicParameters(parameters.Index + median, median, parameters.Direction));
                    }
                }
            }
        }