gpt4 book ai didi

C#归并排序性能

转载 作者:太空狗 更新时间:2023-10-29 17:40:31 25 4
gpt4 key购买 nike

只是一个简短的说明,这不是家庭作业。我只是想复习一下我的算法。我在 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(n< sup>2).

(这是因为递归从

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).)

关于C#归并排序性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com