CSharp - 对比较器的意外调用数

  显示原文与译文双语对照的内容
0 0

不确定为什么在查看比较器的调用数时会得到如此奇数的数字。

对于 2个字符串:5调用? 另外还有类似这个 12字符串的序列: 66调用 13字符串:85调用 14 Strigns: 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}nttDiff:{2}nn", Iterations, CallsToSort, LastCycle-CallsToSort);
 Iterations--;
 }

时间: 原作者:

0 0

Array.Sort() 方法将使用一个快速排序的版本,其中的轴是确定的。 比较自动排序用户的数量将大大依赖于轴,并且你在结果中看到了。

某些代码( 来自 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 是 pivot 。 你很可能会知道为什么要从那里看到结果。

原作者:
...