Array.sort()排序核心思路
根据不同的情况,选择不同的排序算法。
- 当需要排列的元素较少的时候,采用普通的插入排序
当被排序的数组长度小于47但排序不是从数组起始位置开始的时候,那么就会选择哨兵插入排序的方式进行排序。
这种情况主要是当sort被双基准快排递归调用的时候才会使用
-
如果元素较多,大于插入排序的阈值,但是小于归并排序的阈值,这时采用快速排序
在进行快排之前,首先会将这个不长不断的数组按照1/7的长度划分,然后根据这5个划分点进行排序:
2.1. 如果这五个划分点的数据俩俩各不相同,则以第一个划分点和最后一个划分点作为基准点,采用双基准快排;
2.2. 如果这五个划分点有相同的情况,则采用三路快排。 -
如果数组的长度超过了快排的阈值
首先进行有序性的判断,判断这个数组是否是基本有序
将有序部分中断处的位置记录下来,如果中断个数大于某个阈值则判断为无序,反之有序。
3.1 如果是基本有序,则采用归并方式排序,这里会按照刚才记录的有序部分的中断点作为归并点。
3.2 如果判定为无序,则依然采用快排。