我确实知道 4.5 的排序算法是从 4.0 改变的,但我怀疑内省排序的实现有问题。似乎在反向排序列表的情况下表现不规律,当有人期望与“排序”情况(如 4.0 中)相同数量的比较时,这个数字非常大。
.net 4 x64
随机25514058,排序20525265,反转20525285
.net 4.5 x64
随机22112103,排序16935357,反转31148728!!
我用来获取比较次数的代码(使用 4.0 和 4.5 编译)是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace sortTest {
class Program {
class CmpCount : IComparer<int> {
private int _count;
/// <summary>
///
/// </summary>
public int Count {
get {
return _count;
}
}
public int Compare( int x, int y ) {
_count++;
return x.CompareTo( y );
}
}
static void Main( string[] args ) {
Random rnd = new Random(1234);
List<int> list = new List<int>();
for ( int i = 0; i < 1000000; i++ ) {
list.Add( rnd.Next() );
}
CmpCount cmp = new CmpCount();
list.Sort( cmp );
int random = cmp.Count;
cmp = new CmpCount();
list.Sort( cmp );
int sorted = cmp.Count;
cmp = new CmpCount();
list.Reverse();
list.Sort( cmp );
int reversed = cmp.Count;
Console.WriteLine("random {0}, sorted {1}, reversed {2}",random,sorted,reversed);
}
}
}
编辑:我正在调试源代码,似乎从未调用过 HeapSort。也许它需要一个特制的输入来触发它。所以实际上在上述情况下,4.5 排序实际上只是进行快速排序。
快速查看源代码,似乎 4.0 的快速排序更复杂,而 4.5 的实现很差(直接来自书籍?)。
如果我理解正确,4.5 似乎也盲目地偏爱已经排序的列表。这可能是反向排序列表的问题