我正在研究双轴快速排序,我在这里找到了相关资料(第20页)。
比较:
Yaroslavskiy算法平均需要1.9 n ln n次比较。 经典快速排序需要2 n ln n次比较!
交换:
Yaroslavskiy算法所需的交换次数为0.6 n ln n。 经典快速排序所需的交换次数为0.3 n ln n。
结果:
数据类型-----比较次数-------交换次数 int-------------591纳秒---------802纳秒 float-----------838纳秒---------873纳秒 double--------873纳秒---------1047纳秒 char----------593纳秒---------837纳秒
注意:上述结果以纳秒为单位,在Java语言下使用Intel Core 2 Duo进行操作。
如果我们将交换和比较的成本相加,那么除了字符串外,经典快速排序都比Yaroslavskiy快速排序更好。对于字符串,我们使用指针数组来交换,这会花费88纳秒。在字符串的情况下,Yaroslavskiy算法利用了1.9 n ln n的比较优势,因为与交换相比,比较太昂贵了。
我想知道为什么Java使用Yaroslavskiy快速排序?内置库排序的主要重点是字符串,如果不适用于其他数据类型怎么办?
比较:
Yaroslavskiy算法平均需要1.9 n ln n次比较。 经典快速排序需要2 n ln n次比较!
交换:
Yaroslavskiy算法所需的交换次数为0.6 n ln n。 经典快速排序所需的交换次数为0.3 n ln n。
结果:
数据类型-----比较次数-------交换次数 int-------------591纳秒---------802纳秒 float-----------838纳秒---------873纳秒 double--------873纳秒---------1047纳秒 char----------593纳秒---------837纳秒
注意:上述结果以纳秒为单位,在Java语言下使用Intel Core 2 Duo进行操作。
如果我们将交换和比较的成本相加,那么除了字符串外,经典快速排序都比Yaroslavskiy快速排序更好。对于字符串,我们使用指针数组来交换,这会花费88纳秒。在字符串的情况下,Yaroslavskiy算法利用了1.9 n ln n的比较优势,因为与交换相比,比较太昂贵了。
我想知道为什么Java使用Yaroslavskiy快速排序?内置库排序的主要重点是字符串,如果不适用于其他数据类型怎么办?
Collections.sort
可能使用归并排序,但是Arrays.sort
(用于原始类型数组的操作)使用快速排序。这与排序的稳定性有关 - 在原始类型容器上进行稳定或不稳定的排序对结果没有影响,但在对象上有影响。 - Bernhard Barker