Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构的C#排序数组_C#_Algorithm_Sorting - Fatal编程技术网

结构的C#排序数组

结构的C#排序数组,c#,algorithm,sorting,C#,Algorithm,Sorting,我正在运行一个模拟部分,其中需要一组成对的值。 当我使用Array.Sort(v1,v2)时,它根据第一个数组对两个数组进行排序,所有的模拟大约需要9毫秒。 但我需要根据第一个然后第二个进行排序,所以我创建了结构数组。请参阅下面的代码 private struct ValueWithWeight : IComparable<ValueWithWeight> { public double Value; public double Weight; public

我正在运行一个模拟部分,其中需要一组成对的值。 当我使用Array.Sort(v1,v2)时,它根据第一个数组对两个数组进行排序,所有的模拟大约需要9毫秒。 但我需要根据第一个然后第二个进行排序,所以我创建了结构数组。请参阅下面的代码

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>因为您将非常优化它,请考虑以下内容:

  • 排序在数组上运行并执行比较。在您的情况下,将不会取消装箱,因为您在结构上实现了一个接口

  • 排序时执行元素交换。交换在内部是memmove。您的结构至少占用16个字节。你可以试着通过在课堂上分配你的双重价值来减少影响。类将始终占用IntPtr.Size字节(因为您将存储指针),所以它应该复制更少的字节


  • 27毫秒的排序是个实际问题吗?你确定你不是在进行微优化吗?如果你试图不惜任何代价优化你的代码,这可能会让你自己很难理解你的代码。不要在意27毫秒或9毫秒…创建一个合适的基准。我们不知道你是如何得到这些数字的,正因为如此,所提到的数量级是没有意义的。你可能会看到计时器不准确。另外,您的问题是否真的是“为什么比较两个值所花费的时间大约是比较一个值所花费的时间的两倍”?当您进行
    Array.Sort(v1,v2)
    时,两个数组都是
    v1
    (键)和
    v2
    (值;它们是否对应于“权重”?)类型的
    double[
    ?你没有透露太多细节。你是如何测量时间的?这两种情况下的数据完全相同吗?与实现
    IComparable
    的用户定义值类型的排序数组相比,
    double
    的排序数组可能有一些运行时优化,但我不能说这与您提供的信息是否相关。首先按“值”排序,然后按“权重”排序需要做更多的工作,因此,更多的工作需要更多的时间,这是公平的。特别是如果有很多值是相同的,就很容易得到按值排序的数组,但按[value,weight]进行字典排序就更难了。这可能是个好主意,但没有人确切知道。也许你可以做一些实验并报告结果,就像@Jeppe做的那样?我试着换课。时间从27点到30点33@SparcU将测试并告诉我方结果。听起来很奇怪。