国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

javascript排序問(wèn)題探究

scola666 / 2070人閱讀

摘要:通過(guò)看源代碼可以發(fā)現(xiàn),的數(shù)組排序算法實(shí)現(xiàn)的也是快速排序。而且相比較于,它就只是實(shí)現(xiàn)了純粹的快速排序,完全沒(méi)有中的那些性能優(yōu)化的蹤影。

引言

幾個(gè)月前面試的時(shí)候被問(wèn)過(guò)javascriptsort方法的具體算法實(shí)現(xiàn),當(dāng)時(shí)回答的是要看下瀏覽器引擎的實(shí)現(xiàn),今天看到了EFE關(guān)于前端排序的博客,正好學(xué)習(xí)下

問(wèn)題描述

我們經(jīng)常發(fā)現(xiàn)不同瀏覽器的排序結(jié)果不同,由于不同引擎在算法選擇上的差異,在瀏覽器中實(shí)際執(zhí)行的排序效果是不一致的

Chrome中的實(shí)現(xiàn)

ChromeJavaScript引擎是v8。由于它是開(kāi)源的,所以可以直接看源代碼。

核心算法是快排,但是Chrome做了很多優(yōu)化,所以看上去很復(fù)雜,Chrome做的具體優(yōu)化可以看原博客,里面有比較詳細(xì)的介紹,身為前端覺(jué)得基礎(chǔ)知識(shí)不夠用所以沒(méi)有深入去看

Firefox中的實(shí)現(xiàn)

按照現(xiàn)有的信息,SpiderMoney內(nèi)部實(shí)現(xiàn)了歸并排序。

Microsoft Edge中的實(shí)現(xiàn)

Microsoft EdgeJavaScript引擎Chakra的核心部分代碼已經(jīng)于2016年初在Github開(kāi)源。

通過(guò)看源代碼可以發(fā)現(xiàn),Chakra的數(shù)組排序算法實(shí)現(xiàn)的也是快速排序。而且相比較于v8,它就只是實(shí)現(xiàn)了純粹的快速排序,完全沒(méi)有v8中的那些性能優(yōu)化的蹤影。

解決排序穩(wěn)定性的差異

從目前已知的情況來(lái)看,所有主流瀏覽器(包括IE6,7,8)對(duì)于數(shù)組排序算法的實(shí)現(xiàn)基本可以枚舉:

歸并排序 / Timsort

快速排序

所以,我們將快速排序經(jīng)過(guò)定制改造,變成穩(wěn)定排序的是不是就可以了?

一般來(lái)說(shuō),針對(duì)對(duì)象數(shù)組使用不穩(wěn)定排序會(huì)影響結(jié)果。而其他類(lèi)型數(shù)組本身使用穩(wěn)定排序或不穩(wěn)定排序的結(jié)果是相等的。

方案代碼示例

"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));
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80320.html

相關(guān)文章

  • JavaScript專(zhuān)題系列20篇正式完結(jié)!

    摘要:寫(xiě)在前面專(zhuān)題系列是我寫(xiě)的第二個(gè)系列,第一個(gè)系列是深入系列。專(zhuān)題系列自月日發(fā)布第一篇文章,到月日發(fā)布最后一篇,感謝各位朋友的收藏點(diǎn)贊,鼓勵(lì)指正。 寫(xiě)在前面 JavaScript 專(zhuān)題系列是我寫(xiě)的第二個(gè)系列,第一個(gè)系列是 JavaScript 深入系列。 JavaScript 專(zhuān)題系列共計(jì) 20 篇,主要研究日常開(kāi)發(fā)中一些功能點(diǎn)的實(shí)現(xiàn),比如防抖、節(jié)流、去重、類(lèi)型判斷、拷貝、最值、扁平、柯里...

    sixleaves 評(píng)論0 收藏0
  • JavaScript專(zhuān)題之亂序

    摘要:源碼地址為了簡(jiǎn)化篇幅,我們對(duì)這個(gè)數(shù)組進(jìn)行分析,數(shù)組長(zhǎng)度為,此時(shí)采用的是插入排序。插入排序的源碼是其原理在于將第一個(gè)元素視為有序序列,遍歷數(shù)組,將之后的元素依次插入這個(gè)構(gòu)建的有序序列中。 JavaScript 專(zhuān)題系列第十九篇,講解數(shù)組亂序,重點(diǎn)探究 Math.random() 為什么不能真正的亂序? 亂序 亂序的意思就是將數(shù)組打亂。 嗯,沒(méi)有了,直接看代碼吧。 Math.random ...

    I_Am 評(píng)論0 收藏0
  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類(lèi)繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫(xiě)的) this 的值到底...

    blair 評(píng)論0 收藏0
  • 從event loop規(guī)范探究javaScript異步及瀏覽器更新渲染時(shí)機(jī)

    摘要:規(guī)范中定義了瀏覽器何時(shí)進(jìn)行渲染更新,了解它有助于性能優(yōu)化。結(jié)合一些資料,對(duì)上邊規(guī)范給出一些理解有誤請(qǐng)指正每個(gè)線程都有自己的。列為,列為,列為。我們都知道是單線程,渲染計(jì)算和腳本運(yùn)行共用同一線程網(wǎng)絡(luò)請(qǐng)求會(huì)有其他線程,導(dǎo)致腳本運(yùn)行會(huì)阻塞渲染。 本文轉(zhuǎn)自blog 轉(zhuǎn)載請(qǐng)注明出處 異步的思考 event loops隱藏得比較深,很多人對(duì)它很陌生。但提起異步,相信每個(gè)人都知道。異步背后的靠山就是...

    13651657101 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<