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); } }
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); } }