Skip to main content
 首页 » 编程设计

c#之对集合进行排序时调用 CompareTo 方法多少次

2024年01月13日54shihaiming

如果一个类型实现了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);