微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#合并排序性能

只是一个快速的笔记,这不是功课.我只是想刷新我的算法.我在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;
    }
}

这是有效的,但它是痛苦的慢.我使用System.Diagnostic.StopWatch来检查Array.sort(使用QuickSort算法)的性能与我的MergeSort进行比较,差异是非常重要的,我想知道是否可能我正在实现这个错误.任何意见?

解决方法

我不是C#程序员,但问题可能是使用这样的语句?
left = left.Skip(1).ToArray();

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

(这是因为复发变化

T(1) = O(1)

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

其具有T(n)= O(n log n)的解

T(1) = O(1)

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

其具有溶液T(n)= O(n2))

原文地址:https://www.jb51.cc/csharp/92525.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐