Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
为什么.NET排序算法要求将项目与自身进行比较?_.net_Sorting - Fatal编程技术网

为什么.NET排序算法要求将项目与自身进行比较?

为什么.NET排序算法要求将项目与自身进行比较?,.net,sorting,.net,Sorting,我注意到,在.NET中使用自定义的IComparer对数组进行排序时,会请求将项目与自身进行比较 为什么会这样?看看是否要对相同的索引进行比较,并假设结果必须为零,这当然是一个微不足道的优化 示例代码: class Comparer : IComparer<string> { public int Compare(string x, string y) { Console.WriteLine("{0} vs {1}", x, y); return strin

我注意到,在.NET中使用自定义的
IComparer
对数组进行排序时,会请求将项目与自身进行比较

为什么会这样?看看是否要对相同的索引进行比较,并假设结果必须为零,这当然是一个微不足道的优化

示例代码:

class Comparer : IComparer<string>
{
  public int Compare(string x, string y)
  {
    Console.WriteLine("{0} vs {1}", x, y);

    return string.Compare(x, y);
  }
}

static void Main(string[] args)
{
  var values = new[] {"A", "D", "C", "B", "E"};

  Array.Sort(values, new Comparer());
}

人们报告不同的结果,因为Array.Sort()算法已更改多次。至少在.NET4.0和.NET4.5中,可能在这之前。最新和最棒的版本从快速排序切换到内部排序

您将看到一个元素自身进行比较,这是由于对Quicksort非常糟糕的最坏情况行为O(n^2)采取了反措施。这本书很好地解释了这一点:

在快速排序中,关键操作之一是选择轴心:列表分区所围绕的元素。最简单的轴心选择算法是将列表的第一个或最后一个元素作为轴心,这会导致排序或接近排序的输入行为不佳。Niklaus-Wirth的变体使用中间元素来防止这些事件的发生,对于人造序列,退化为O(n²)。中位数3轴选择算法取列表中第一个、中间和最后一个元素的中位数;然而,即使这在许多现实世界的输入中表现良好,仍然有可能设计出一个中位数为3的杀手列表,这将导致基于此轴心选择技术的快速排序的急剧减速。攻击者可能会利用这些输入,例如将此类列表发送到Internet服务器进行排序,作为拒绝服务攻击


您正在看到中位数3轴选择算法的副作用。

无法重现,我的输出:D vs A C vs D C vs A B vs D B vs C B vs A E vs D可能添加您正在使用的框架版本…我得到的输出与问题完全相同。嗯。。。我使用的是.NET4,我确实得到了“流氓”的比较结果。@HansPassant:我在LinqPad4(.NET4)中运行,仍然得到了相同的结果。
A vs C
A vs E
C vs E
A vs C
D vs C
C vs E
C vs B
C vs C   ***
C vs C   ***
A vs B
A vs B
A vs A   ***
A vs B
A vs A   ***
D vs E
D vs E
D vs D   ***
D vs E
D vs D   ***