对Comparer的调用次数意外

时间:2011-10-13 00:17:23

标签: c# comparison

不确定为什么在查看Comparer的呼叫次数时我会得到这样的奇数。

2个字符串:5个电话? 此外,还有像这样的序列 12个字符串:66个电话 13个字符串:85个电话 14条标志:91个电话 15个字符串:89个电话?????

排序15个字符串比14个字符串真的更有效吗?

int Iterations = 20;
int LastCycle = 0;
int CallsToSort = 0;
while (Iterations > 0)
        {
            LastCycle = CallsToSort;
            CallsToSort = 0;
            var strings = new string[Iterations];
            for (int i = 0; i < Iterations; i++) { strings[i] = "test" + i; }

            Array.Sort(strings, (s1, s2) => { CallsToSort++; return s1.CompareTo(s2); });
            Console.WriteLine("Strings:{0}\nCalls to Sort: {1}\n\t\tDiff:{2}\n\n", Iterations, CallsToSort, LastCycle-CallsToSort);
            Iterations--;
        }

1 个答案:

答案 0 :(得分:2)

Array.Sort()方法将(通常)最终使用QuickSort版本,其中确定性地选择枢轴。 QuickSort使用的比较次数在很大程度上取决于枢轴,您在结果中看到了这一点。

一些代码(来自ILSpy):

    int num = left;
    int num2 = right;
    int num3 = num + (num2 - num >> 1);
    ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, num, num3);
    ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, num, num2);
    ArraySortHelper<T>.SwapIfGreaterWithItems(keys, comparer, num3, num2);
    T t = keys[num3];

t是枢轴。你可以确切地知道为什么你会看到那里的结果。