Linq OrderBy().ThenBy()方法序列的时间复杂度是多少?

tun*_*luk 16 c# linq big-o lambda

我在我的项目中使用Linq和Lambda Operations,我需要根据类的两个属性对List进行排序.因此,我使用了OrderBy().ThenBy()方法如下:

class ValueWithIndex{
    public long Value;
    public int Index;
}
...

List<ValueWithIndex> valuesWithIndex = new List<ValueWithIndex>();

for (int i = 0; i < A.Length; i++){
    ValueWithIndex vi = new ValueWithIndex();
    vi.Value = A[i];
    vi.Index = i;
    valuesWithIndex.Add(vi);
}
var orderedValues = valuesWithIndex.OrderBy(v => v.Value).ThenBy(v => v.Index);

...
Run Code Online (Sandbox Code Playgroud)

这个答案中,我们解释说,OrderBy()使用Quicksort,因此即使它具有O(N*logN)平均时间复杂度,对于最坏的情况,时间复杂度约为O(N 2).如果ThenBy()方法的时间复杂度最差为O(N 2),那么使用这些方法毫无意义.

ThenBy()方法也使用Quicksort吗?如果是,那是否意味着对于相同的"v.Value","v.Index"会被排序为O(N 2)最差的时间复杂度?

Iva*_*oev 24

LINQ OrderBy(...).ThenBy(...)...ThenBy(...)方法链通过多个排序键(使用多键比较器)形成单个排序操作.

因此,无论ThenBy(Descending)您在链中包含多少方法,排序操作的时间复杂度仍然是QuickSort O(N*logN)平均值/ O(N 2)最差情况的典型时间.当然,您添加的更多键,比较两个对象将花费更多时间,但排序操作的复杂性不会改变.

  • 你已经做对了:)实际上它不一定会增加排序的时间,因为通常对于多键比较器,第二个,第三个等,只有先前的比较器返回相等才会调用比较器,即取决于如何您在第一,第二等级别拥有的许多重复键.在你的例子中,`Index`将仅与具有相同`Value`的项目进行比较. (4认同)