javascript排序题目探讨

弁言

几个月前口试的时刻被问过javascriptsort要领的细致算法完成,当时回复的是要看下浏览器引擎的完成,本日看到了EFE关于前端排序的博客,恰好进修下

题目形貌

我们常常发明差别浏览器的排序结果差别,因为差别引擎在算法挑选上的差别,在浏览器中现实实行的排序结果是不一致的

Chrome中的完成

ChromeJavaScript引擎是v8。因为它是开源的,所以能够直接看源代码

中心算法是快排,然则Chrome做了许多优化,所以看上去很庞杂,Chrome做的细致优化能够看原博客,内里有比较细致的引见,身为前端以为基础知识不够用所以没有深切去看

Firefox中的完成

根据现有的信息,SpiderMoney内部完成了合并排序。

Microsoft Edge中的完成

Microsoft EdgeJavaScript引擎Chakra的中心部份代码已于2016年终在Github开源。

经由过程看源代码能够发明,Chakra的数组排序算法完成的也是疾速排序。而且相比较于v8,它就只是完成了地道的疾速排序,完整没有v8中的那些机能优化的踪迹。

处理排序稳固性的差别

从现在已知的状况来看,一切主流浏览器(包含IE6,7,8)关于数组排序算法的完成基础能够罗列:

  • 合并排序 / Timsort

  • 疾速排序

所以,我们将疾速排序经由定制革新,变成稳固排序的是否是就能够了?

一般来说,针对对象数组运用不稳固排序会影响结果。而其他范例数组自身运用稳固排序或不稳固排序的结果是相称的。

计划代码示例

'use strict';

const INDEX = Symbol('index');

function getComparer(compare) {
    return function (left, right) {
        let result = compare(left, right);

        return result === 0 ? left[INDEX] - right[INDEX] : result;
    };
}

function sort(array, compare) {
    array = array.map(
        (item, index) => {
            if (typeof item === 'object') {
                item[INDEX] = index;
            }

            return item;
        }
    );

    return array.sort(getComparer(compare));
}
    原文作者:jasminecjc
    原文地址: https://segmentfault.com/a/1190000006821651
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞