如果一个类型实现了IComparable<T>并且您有一个包含 100 个元素的此类集合。当您对该集合调用 Sort 方法时,CompareTo 会被调用多少次?方法被调用,如何调用?会这样使用吗?
CompareTo(item0, item1);
CompareTo(item1, item2);
CompareTo(item2, item3);
CompareTo(item3, item4);
...
CompareTo(item97, item98);
CompareTo(item98, item99);
编辑:基本上我想做的是将这种排序方式转变为基于值的排序方式,在这种方式中,我为每个项目分配一些值,然后对它们进行排序。很难解释,但我无法使用基于 -1,0,1 的排序函数来解决这个问题。但我所拥有的只是一个 CompareTo 函数,我需要用它来对项目进行排序。所以我需要为每个项目生成一些值,然后程序将它们从最小值到最大值排序。
请您参考如下方法:
嗯,您不能 100% 确定(对于大多数排序算法),因为它取决于数据。例如,某些排序算法只会对已排序的数据执行 N 次(N 是集合的大小)比较,但如果未排序,则需要执行更多次比较。
常用的排序算法,如MergeSort、QuickSort、HeapSort,都是O(n*log(n)),也就是说比较的次数是item数乘以log的量级项目数量的基础。 (这些算法的对数基数将为 2。)虽然这不是精确的,但它会随着这种关系扩展。
如果您对特定排序操作被调用的次数感兴趣,您可以使用类似这样的方法:
public class LoggingComparer<T> : IComparer<T>
{
private IComparer<T> otherComparer;
public LoggingComparer(IComparer<T> otherComparer)
{
this.otherComparer = otherComparer;
}
public int Count { get; private set; }
public int Compare(T x, T y)
{
Count++;
return otherComparer.Compare(x, y);
}
}
它将包装另一个比较器,但也会计算比较调用的次数。这是一个示例用法:
var list = new List<int>() { 5, 4, 1, 2, 3, 8, 7, 9, 0 };
LoggingComparer<int> comparer = new LoggingComparer<int>(Comparer<int>.Default);
list.Sort(comparer);
Console.WriteLine(comparer.Count);
