如果我将自定义的IComparer传递给List的实例的Sort()方法,那么比较器的Compare(x,y)方法是否会使用相同的项进行调用?
即:是否可能调用
编辑:更关注列表项是不同的情况。
即:是否可能调用
Compare(x,x)
。编辑:更关注列表项是不同的情况。
Compare(x,x)
。我写了一个测试程序来尝试它。看起来它实际上确实将同一元素与自身进行比较(至少对于相同的项两次调用了 Compare())。在这个程序中,Compare() 被调用时带有参数 (2, 2)。
using System;
using System.Collections.Generic;
static class Program
{
class MyComparer : Comparer<int>
{
public override int Compare(int x, int y)
{
Console.WriteLine("Compare(" + x + ", " + y + ")");
if (x < y) return -1;
if (x > y) return 1;
return 0;
}
}
static void Main()
{
MyComparer comparer = new MyComparer();
List<int> list = new List<int> { 1, 2, 3 };
list.Sort(comparer);
return;
}
}
输出结果如下:
Compare(1, 2)
Compare(1, 3)
Compare(2, 3)
Compare(1, 2)
Compare(2, 2)
Compare(2, 3)
Compare(2, 2)
Compare(1, 2) Compare(1, 3) Compare(2, 3)
,非常高效。 - Jeppe Stig Nielsen根据文档所述:
此方法使用Array.Sort, 该方法使用快速排序算法。
快速排序不会将一个项目与自身进行比较。某些快速排序的实现会将项目与自身进行比较。如果该项在列表中出现多次,则可能会发生这种情况。
无论哪种情况,在您的比较函数成为适当的、良好行为的比较函数时,您需要处理元素与其自身进行比较的情况。
最坏情况下,此操作的时间复杂度为 O(n^2),其中 n 是要排序的元素数。平均情况下,它是 O(n log n)。
尽管这暗示了 QuickSort,但这绝对不是保证。规范也不要求使用 Array.Sort
进行实现。
底线:就规范而言,实现将项目与自身进行比较是完全可以的。