【发布时间】:2019-11-26 21:03:30
【问题描述】:
我正在尝试将一些旧的 C/C++ 代码移植到 C#/Unity。在几个地方,我调用了 qsort 函数。这是一个例子:
qsort((void *) CardSort, NumCards, sizeof (CardSort[0]), SortFunction);
其中 SortFunction 是指向我自己的标准函数的指针。这是一个例子:
int SortFunction (const void * a, const void * b)
{
int i, j, iValue, jValue;
memcpy (&i, a, 2);
memcpy (&j, b, 2);
iValue = TrickValue (i, GetSuit (i));
jValue = TrickValue (j, GetSuit (j));
return (iValue - jValue);
}
这只是我需要导入的几个示例中的一个。我尝试使用快速排序算法(枢轴、左、右)来复制它,但我需要修改它的每个实例以反映我不同的 SortFunction。每一个都是一种痛苦。
我只想编写自己的 qsort 例程,这样我就可以简单地将代码原封不动地拉入,但我在网上找不到示例。由于我对原始 qsort 的内部工作原理一无所知,我希望这里有人可以帮助我。
简而言之:是否有 C# 实现,或者有人可以指导我编写我自己的实现,它复制了 C/C++ qsort 的功能?
【问题讨论】:
-
Array.Sort方法大部分时间使用快速排序。见remarks。 -
SortFunction 是 IComparer
的一个实现,您可以在 Array.Sort、List.Sort、Linq.Orderby 等多个函数中使用它。没有真正需要关心的地方自己的排序算法。如果您想要更高的性能,请将其保留在 C 中。还有托管 C++,即用于 .NET 的 C++,但已声明不推荐使用。所以不要保留你的代码。保留你的想法。 -
我强烈建议不要重新实现您自己的排序,然后逐行移植您的比较算法。 C# 已经有就地排序、外部排序、使用比较键排序、使用比较器对象排序等机制;我们拥有丰富、功能齐全的世界级序列操作函数库。 了解如何使用它们。从长远来看,这将为您节省时间!