C#合并排序性能

hob*_*eau 9 c# sorting algorithm mergesort

只是一个简单的说明,这不是功课.我只是想弄清楚我的算法.我在C#中使用MergeSort,我编写了一个可以根据泛型进行排序的递归方法:

class SortAlgorithms
{

    public T[] MergeSort<T> (T[] unsortedArray) where T : System.IComparable<T>
    {
        T[] left, right;
        int middle = unsortedArray.Length / 2;

        left = new T[middle];
        right = new T[unsortedArray.Length - middle];

        if (unsortedArray.Length <= 1)
            return unsortedArray;

        for (int i = 0; i < middle; i++)
        {
            left[i] = unsortedArray[i];
        }

        for (int i = middle; i < unsortedArray.Length; i++)
        {
            right[i - middle] = unsortedArray[i];
        }

        left = MergeSort(left);

        right = MergeSort(right);


        return Merge<T>(left, right);
    }

    private T[] Merge<T> (T[] left, T[] right) where T : System.IComparable<T>
    {
        T[] result = new T[left.Length + right.Length];

        int currentElement = 0;

        while (left.Length > 0 || right.Length > 0)
        {
            if (left.Length > 0 && right.Length > 0)
            {
                if (left[0].CompareTo(right[0]) < 0)
                {
                    result[currentElement] = left[0];
                    left = left.Skip(1).ToArray();
                    currentElement++;
                }
                else
                {
                    result[currentElement] = right[0];
                    right = right.Skip(1).ToArray();
                    currentElement++;
                }
            }
            else if (left.Length > 0)
            {
                result[currentElement] = left[0];
                left = left.Skip(1).ToArray();
                currentElement++;
            }
            else if (right.Length > 0)
            {
                result[currentElement] = right[0];
                right = right.Skip(1).ToArray();
                currentElement++;
            }
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但速度很慢.我已经使用System.Diagnostic.StopWatch来检查Array.Sort(它使用QuickSort算法)的性能来与我的MergeSort进行比较,差异是如此显着我想知道我是否实现了这个错误.任何意见?

tem*_*def 12

我不是C#程序员,但问题可能是使用像这样的语句吗?

left = left.Skip(1).ToArray();
Run Code Online (Sandbox Code Playgroud)

这可能以强制底层数组的深层副本的方式实现.如果是这样,这会将合并的性能从O(n)降低到O(n 2),立即将生成的合并排序的性能从O(n log n)降低到O(n 2).

(这是因为重复发生变化

T(1)= O(1)

T(n)≤2T(n/2)+ O(n)

其解决方案T(n)= O(n log n),to

T(1)= O(1)

T(n)≤2T(n/2)+ O(n 2)

其解决方案T(n)= O(n 2).)