结构的C#排序数组
我正在运行一个模拟部分,其中需要一组成对的值。 当我使用Array.Sort(v1,v2)时,它根据第一个数组对两个数组进行排序,所有的模拟大约需要9毫秒。 但我需要根据第一个然后第二个进行排序,所以我创建了结构数组。请参阅下面的代码结构的C#排序数组,c#,algorithm,sorting,C#,Algorithm,Sorting,我正在运行一个模拟部分,其中需要一组成对的值。 当我使用Array.Sort(v1,v2)时,它根据第一个数组对两个数组进行排序,所有的模拟大约需要9毫秒。 但我需要根据第一个然后第二个进行排序,所以我创建了结构数组。请参阅下面的代码 private struct ValueWithWeight : IComparable<ValueWithWeight> { public double Value; public double Weight; public
private struct ValueWithWeight : IComparable<ValueWithWeight>
{
public double Value;
public double Weight;
public int CompareTo(ValueWithWeight other)
{
int cmp = this.Value.CompareTo(other.Value);
if (cmp != 0)
return cmp;
else
return this.Weight.CompareTo(other.Weight);
}
}
void Usage()
{
ValueWithWeight[] data = FillData();
Array.Sort(data);
}
private struct ValueWithWeight:i可比较
{
公共双重价值;
公共双权;
公共int比较(值与重量其他)
{
int cmp=this.Value.CompareTo(其他.Value);
如果(cmp!=0)
返回cmp;
其他的
将此.Weight.CompareTo返回(其他.Weight);
}
}
无效用法()
{
ValueWithWeight[]数据=FillData();
数组.排序(数据);
}
现在大约需要27毫秒。有没有更好的分类方法>P>因为您将非常优化它,请考虑以下内容:
27毫秒的排序是个实际问题吗?你确定你不是在进行微优化吗?如果你试图不惜任何代价优化你的代码,这可能会让你自己很难理解你的代码。不要在意27毫秒或9毫秒…创建一个合适的基准。我们不知道你是如何得到这些数字的,正因为如此,所提到的数量级是没有意义的。你可能会看到计时器不准确。另外,您的问题是否真的是“为什么比较两个值所花费的时间大约是比较一个值所花费的时间的两倍”?当您进行
Array.Sort(v1,v2)
时,两个数组都是v1
(键)和v2
(值;它们是否对应于“权重”?)类型的double[
?你没有透露太多细节。你是如何测量时间的?这两种情况下的数据完全相同吗?与实现IComparable
的用户定义值类型的排序数组相比,double
的排序数组可能有一些运行时优化,但我不能说这与您提供的信息是否相关。首先按“值”排序,然后按“权重”排序需要做更多的工作,因此,更多的工作需要更多的时间,这是公平的。特别是如果有很多值是相同的,就很容易得到按值排序的数组,但按[value,weight]进行字典排序就更难了。这可能是个好主意,但没有人确切知道。也许你可以做一些实验并报告结果,就像@Jeppe做的那样?我试着换课。时间从27点到30点33@SparcU将测试并告诉我方结果。听起来很奇怪。