对对象排序的方法:Timsort()
Java默认的对对象排序的方法是Arrays.sort(),
关于Arrays.sort()的对对象排序都存在重载,但是在底层调用的都是TimSort()
我们来先了解一下方法的描述以及TimSort的参数意义
对对象排序方法的简单描述:
对对象数组排序时,首先这个数组的任意两个元素都可以相互比较,我们需要传入比较器Comparator对任意两个元素进行比较时不能抛出异常,这种排序是稳定(因为底层最终使用的是归并排序)的,这是迭代的自适应的归并排序,这种排序的时间复杂度比 n * log n 要少的多。
该实现改编自Tim Peters的Python列表sort。
我们看到这个方法的结构是,如果不传入比较器,那么就默认使用无比较器的对象排序方法,
如果有比较器,如果用户请求的是使用LegacyMergeSort,那么就使用legacyMergeSort(a, c);
这个方法本质上就是归并排序。
否则调用TimSort();
TimSort
TimeSort简单描述:
对给定的范围进行排序,尽可能使用给定的工作空间数组片作为临时存储。
TimeSort可以理解为多路归并排序,什么叫做多路归并排序呢?
归并排序是将一个数组一分为二,再分为二,一直分到单位为1,然后两两排序归并,也就是两两归并。
而多路归并排序,是将一个数组分为多个待排数组,也就是分为4个,8个或者16个之类的,对这4个数组内部进行归并,再对这四个进行归并。这就是多路归并的思想。
系统源码:
static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
T