从sort引出前端排序算法

96 阅读2分钟

我们日常开发中,用到的排序方法基本上是 Array.prototype.sort 通过传入比较函数,实现自定义排序顺序,比如按照字符串长度排序,如实现版本号排序;按照对象中的某个属性排序,为贪心算法做好数据处理。

比较函数用起来太方便啦,我甚至不会去谈本溯源。偶尔的一次问题交流,我了解到其底层处理的复杂性,居然有这么多排序算法的演进!你是否了解其主要实现的演进呢?在 v8 引擎中,数组的 sort 历经版本迭代,其主要实现方式也有较大演进。如以下列表中列出的:

  • 5.9.221 版本根据数组长度的不同选取不同的排序算法,在一定范围内(10)选取插入排序(InsertionSort),之后选择快速排序(QuickSort);
  • 8.0.426.27 选取归并排序(TypedArrayMergeSort)
  • 10.9.194.10 选取二分插入排序(BinaryInsertionSort)

同时在规范本身没有做出对根据参数选择排序算法的规定,排序算法优化是引擎处理的,且不同引擎处理不一致。 规范表明元素顺序不一定和之前的一致,即不稳定。这个大家有了解就好,算法在改进,但是某一算法的思路大差不差,本教程重点关注的算法思路,以及一些重点,预期使大家能够对主要排序算法有浅层理解(我也是菜鸡,和大家不断进步)。

参考文档

描述链接
v8 排序5.9.221 InsertionSort & QuickSort github.com/v8/v8/blob/…
v8 排序 8.0.426.27 TypedArrayMergeSortgithub.com/v8/v8/blob/…
v8 10.9.194.10 BinaryInsertionSortgithub.com/v8/v8/blob/… ==> github.com/v8/v8/blob/…

各类排序

快排(quick_sort)
描述链接
快排优质文章推荐www.cnblogs.com/skywang1234…

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情