为什么java.util.Arrays中使用两种排序算法
java.util.Arrays中
使用快速排序(在最近的版本实际上双支点快速排序)的基本类型,如整型
和归并为实现对象的比较
,或者使用一个比较器
。为什么会有差别?为什么不挑一个,并将其用于所有的情况?罗伯特·塞奇威克表明了“的想法,如果一个程序员的使用对象,也许空间不是一个极为重要的考虑因素,所以使用的归并多余的空间,也许不是一个问题,如果设计师的评估程序员的使用基本类型,也许表现是最重要的事情,所以我们使用了快速排序“,但我认为有一个更明显的原因。
快速排序是在这两种情况下更快。归并排序是稳定在这两种情况下。但是对于原始类型快速排序是稳定的呢!这是因为原始类型在Java中像量子力学基本粒子。你不能告诉1个7,另外7之间的差别,他们的值是所有定义它们。排序的数组,例如[7,6,6,7,6,5,4,6,0]到[0,4,5,6,6,6,6,7,8]。你不仅不关心这6结束了在哪个位置。这是一个伪命题。该阵列的位置不抱指向的对象。它们容纳的对象的实际值。倒不如说,所有的原始值将被丢弃并更换新的。还是不行。它只是无关紧要的。还有就是你可以告诉一个稳定的和不稳定的排序算法的输出之间的差异,当所有的分类是基本类型没有可能的方式。稳定是不相关的原始类型在Java中。
相比之下排序的对象,包括原始类型的OA办公系统密钥排序对象时,你选的指针。对象本身是有一个独立的性质有别于它们的键值。有时候,这可能不是问题的所有那么多,例如,如果你正在整理java.lang.Strings
,但有时它的问题很大。借用一个例子来自塞奇威克的算法I级,假设你被选部分学生记录:
public class Student { String lastname; String firstName; int section; }
假设你开始一个列表按姓氏排序,然后名字:
John | Alisson | 2 |
Nabeel | Aronowitz | 3 |
Joe | Jones | 2 |
James | Ledbetter | 2 |
Ilya | Lessing | 1 |
Betty | Lipschitz | 2 |
Betty | Neubacher | 2 |
John | Neubacher | 3 |
Katie | Senya | 1 |
Jim | Smith | 3 |
Ping | Yi | 1 |
当您第一次排序此,如果排序是稳定的,然后它仍然会按姓氏和名字每一节中进行排序:
Ilya | Lessing | 1 |
Katie | Senya | 1 |
Ping | Yi | 1 |
John | Alisson | 2 |
Joe | Jones | 2 |
James | Ledbetter | 2 |
Betty | Lipschitz | 2 |
Betty | Neubacher | 2 |
Nabeel | Aronowitz | 3 |
John | Neubacher | 3 |
Jim | Smith | 3 |
但是,如果你使用快速排序,你会拥有这样的事情,并有按名称诉诸每个部分通过名称来维持排序:
Ilya | Lessing | 1 |
Katie | Senya | 1 |
Ping | Yi | 1 |
Betty | Lipschitz | 2 |
Betty | Neubacher | 2 |
John | Alisson | 2 |
Joe | Jones | 2 |
James | Ledbetter | 2 |
Jim | Smith | 3 |
John | Neubacher | 3 |
Nabeel | Aronowitz | 3 |