不确定为什么在查看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--;
}
答案 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
是枢轴。你可以确切地知道为什么你会看到那里的结果。