在Java的Arrays和Collections类里,分别提供了对数组和List的排序算法。不过今天在看Arrays排序算法时,发现对float/long/int/char等进行排序时,使用的算法是快速排序;而对于Object数组排序则是使用的是合并排序(改进后的)。
想了一下,原因很容易理解。快速排序是不稳定的算法,这意味着对于相同的元素经过排序后会出现位置调换的情况。而对于基本类型的数组,这个却无关紧要;而对于Object数组这个则很重要,因为大部分时间我们都需要一个稳定的算法,而合并排序恰好满足这一特性。所以对原始类型数组采用了快速排序,对于Object数组采用了合并排序。
?
而在Collections提供的排序算法也是合并排序。
?
当然JAVA使用的合并排序、快速排序与教科书上当然不一样。他们对排序算法进行了优化。我们可以看看源代码来看看java是怎么实现排序的。