我知道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;
在尝试评估程序的性能时,我总是将sort()函数视为性能最差的-n^2函数。然而,我偶然看到了维基百科的一个页面:
它指出GNU C Library sort()首先使用某种称为Introsort的混合排序算法,然后执行插入排序。Introsort的对应页面声称该算法的最坏情况性能为nlogn。但是,由于我不熟悉这个算法,所以我仍然对sort()有以下担忧:
1) GNU sort()使用的混合算法能保证O(nlogn)的性能吗?如果是这样,nlogn的恒定开销能有多大?
2)有没有其他实现可能导致sort()的性能比这个更差(或者更好,这会更好)?
编辑:回复Kevin:提到的sort()
我正在尝试将一些mysql表从latin1转换为utf8。我正在使用下面的命令,它似乎基本上是有效的。
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
然而,在一个表中,我得到了一个关于重复键条目的错误。这是由"name“字段上的唯一索引引起的。似乎当转换为utf8时,任何“特殊”字符都被索引为其直接的英语对等字符。例如,已经有一个名称字段值为"Dru“的记录。转换为utf8时,带有"Drü“的记录被视为重复记录。“帕特里克”和“帕特里克”也是如此。
以下是如何重现