Ejemplo n.º 1
0
        private void Merge(T[] items, ISortOperator <T> sortOperator, int leftIndex, int leftLength, int rightIndex, int rightLength)
        {
            T[] array = new T[leftLength + rightLength];

            for (int i = 0, iLeft = leftIndex, iRight = rightIndex; i < array.Length; i++)
            {
                if (iLeft < leftIndex + leftLength)
                {
                    if (iRight < rightIndex + rightLength)
                    {
                        array[i] = sortOperator.Compare(items, iLeft, iRight) == -1
                            ? items[iLeft++]
                            : items[iRight++];
                    }
                    else
                    {
                        array[i] = items[iLeft++];
                    }
                }
                else
                {
                    array[i] = items[iRight++];
                }
            }

            // Can use Buffer.BlockCopy() or MsvcrtCopy for performance
            for (var i = 0; i < array.Length; i++)
            {
                sortOperator.Set(items, array[i], i + leftIndex);
            }
        }
Ejemplo n.º 2
0
        public void Sort(T[] items, ISortOperator <T> sortOperator)
        {
            var          count = 0;
            TreeNode <T> root  = null;

            for (var i = 0; i < items.Length; i++)
            {
                var node = new TreeNode <T>(items[i], i);

                Add(items, sortOperator, node, ref count, ref root);
            }

            T[] ordered = Inorder(ref count, ref root);

            for (var i = 0; i < ordered.Length; i++)
            {
                sortOperator.Set(items, ordered[i], i);
            }
        }