弁言
几个月前口试的时刻被问过javascript
中sort
要领的细致算法完成,当时回复的是要看下浏览器引擎的完成,本日看到了EFE关于前端排序的博客,恰好进修下
题目形貌
我们常常发明差别浏览器的排序结果差别,因为差别引擎在算法挑选上的差别,在浏览器中现实实行的排序结果是不一致的
Chrome
中的完成
Chrome
的JavaScript
引擎是v8。因为它是开源的,所以能够直接看源代码。
中心算法是快排,然则Chrome
做了许多优化,所以看上去很庞杂,Chrome
做的细致优化能够看原博客,内里有比较细致的引见,身为前端以为基础知识不够用所以没有深切去看
Firefox
中的完成
根据现有的信息,SpiderMoney
内部完成了合并排序。
Microsoft Edge
中的完成
Microsoft Edge
的JavaScript
引擎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));
}