我们日常开发中,用到的排序方法基本上是 Array.prototype.sort
通过传入比较函数,实现自定义排序顺序,比如按照字符串长度排序,如实现版本号排序;按照对象中的某个属性排序,为贪心算法做好数据处理。
比较函数用起来太方便啦,我甚至不会去谈本溯源。偶尔的一次问题交流,我了解到其底层处理的复杂性,居然有这么多排序算法的演进!你是否了解其主要实现的演进呢?在 v8
引擎中,数组的 sort
历经版本迭代,其主要实现方式也有较大演进。如以下列表中列出的:
5.9.221
版本根据数组长度的不同选取不同的排序算法,在一定范围内(10)选取插入排序(InsertionSort
),之后选择快速排序(QuickSort
);8.0.426.27
选取归并排序(TypedArrayMergeSort
)10.9.194.10
选取二分插入排序(BinaryInsertionSort
)
同时在规范本身没有做出对根据参数选择排序算法的规定,排序算法优化是引擎处理的,且不同引擎处理不一致。 规范表明元素顺序不一定和之前的一致,即不稳定。这个大家有了解就好,算法在改进,但是某一算法的思路大差不差,本教程重点关注的算法思路,以及一些重点,预期使大家能够对主要排序算法有浅层理解(我也是菜鸡,和大家不断进步)。
参考文档
- blog.shovonhasan.com/time-space-…
- stackoverflow.com/questions/5…
- 262.ecma-international.org/7.0/#sec-ar…
- 讲解录屏
- 代码仓库
描述 | 链接 |
---|---|
v8 排序5.9.221 InsertionSort & QuickSort | github.com/v8/v8/blob/… |
v8 排序 8.0.426.27 TypedArrayMergeSort | github.com/v8/v8/blob/… |
v8 10.9.194.10 BinaryInsertionSort | github.com/v8/v8/blob/… ==> github.com/v8/v8/blob/… |
各类排序
快排(quick_sort)
描述 | 链接 |
---|---|
快排优质文章推荐 | www.cnblogs.com/skywang1234… |
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情