亚洲精品久久久久久第一页-人妻少妇精彩视品一区二区三区-91国产自拍免费视频-免费一级a在线播放视频正片-少妇天天日天天射天天爽-国产大屁股喷水视频在线观看-操美女骚穴抽插性爱视频-亚洲 欧美 中文字幕 丝袜-成人免费无码片在线观看

新手必知數(shù)組排序?qū)嵅俨襟E 對數(shù)組進(jìn)行排序的方法


新手必知數(shù)組排序?qū)嵅俨襟E 對數(shù)組進(jìn)行排序的方法

文章插圖
const arr = [49, 5, 14, 89, 71, 3, 10];// 一般寫法arr.sort(function (a, b) {return a - b;// 按照升序排列 });// 箭頭函數(shù)arr.sort((a, b) => a - b);// 結(jié)果[3, 5, 10, 14, 49, 71, 89]用歸用,照葫蘆畫瓢不難,大家日常也是這么寫的,沒毛??!但是如果對一個方法不進(jìn)行深入研究,那么就很容易踩坑,并且常常會填不了坑!
今天,我們重點聊聊比較函數(shù) compareFunction 相關(guān)的知識 。
為了接下來的思路能夠更順暢,在學(xué)習(xí)比較函數(shù)之前,我們先來了解一下有關(guān)插入排序的原理 。
插入排序插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法 。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入 。
算法描述:
一般來說,插入排序都采用 in-place 在數(shù)組上實現(xiàn):
從第一個元素開始,該元素可以認(rèn)為已經(jīng)被排序;取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描;如果該元素(已排序)大于新元素,將該元素移到下一位置;重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;將新元素插入到該位置后;重復(fù)步驟2~5 。動圖演示:
插入排序
其實可以用一句話總結(jié):從數(shù)組中第二個元素起(第一個元素已默認(rèn)排序),每個元素都充當(dāng)一次游標(biāo)值,依次和它前面的(已排序)的元素相比較,如果游標(biāo)值小,則將拿來比較的元素向后移一位,繼續(xù)向前比較;否則,將游標(biāo)值插入比較值的后面,結(jié)束比較 。
關(guān)于比較函數(shù) compareFunction如果想要 sort() 方法按照一定的規(guī)則進(jìn)行排序(比如數(shù)字大小),那么就需要給它指定比較函數(shù) compareFunction 。
如果指明了 compareFunction,那么數(shù)組會按照調(diào)用該函數(shù)的返回值排序,它有兩個參數(shù) a 和 b,返回值如下:
如果 compareFunction(a, b) 小于 0,那么 a 會被排列到 b 之前 。如果 compareFunction(a, b) 等于 0,a 和 b 的相對位置不變 。如果 compareFunction(a, b) 大于 0,b 會被排列到 a 之前 。compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結(jié)果,否則排序的結(jié)果將是不確定的 。compareFunction 初步探究我們暫不做什么復(fù)雜的分析,先使用控制臺打印一下看看 a 和 b 到底是什么:
const arr = [49, 5, 14, 89, 71, 3, 10];console.log(arr);let times = 0;let res = [];arr.sort((a, b) => {res.push({times, a, b, "a - b": a - b});times++;return a - b;});console.log(res);console.log(arr);執(zhí)行結(jié)果如下:
通過上圖,我們可以看到:
a 的值在按照原數(shù)組中的順序依次變化,這個排序采用的應(yīng)該是插入排序法 。a 代表的應(yīng)該是游標(biāo) 。從 b 值的變化上又可以看出,a 首次找位置時采用了二分法,a < b 則向前比較,a>b 則向后比較 。那么,其機(jī)理到底是不是我們所看到這樣一個過程,還需要再探究 。
compareFunction 深入探究要想弄清楚一個問題,還有什么比從根源上著手效率更高的呢?所以我們追根溯源,先來扒一扒 v8引擎 的源碼,看看它內(nèi)部到底是怎么實現(xiàn) sort 接口的 。
下面的源碼來自7.2版本之前的 v8,該版本之后的數(shù)組排序?qū)崿F(xiàn)變化較大,暫不予討論 。
其中 array.js 文件下,關(guān)于 sort 接口實現(xiàn)的代碼如下:
function InnerArraySort(array, length, comparefn) {// In-place QuickSort algorithm.// For short (length <= 22) arrays, insertion sort is used for efficiency.if (!IS_CALLABLE(comparefn)) {comparefn = function (x, y) {if (x === y) return 0;if (% _IsSmi(x) && % _IsSmi(y)) {return % SmiLexicographicCompare(x, y);}// 將數(shù)組元素轉(zhuǎn)換為字符串x = TO_STRING(x);y = TO_STRING(y);if (x == y) return 0;else return x < y ? -1 : 1;};}var InsertionSort = function InsertionSort(a, from, to) {for (var i = from + 1; i < to; i++) {var element = a[i];for (var j = i - 1; j >= from; j--) {var tmp = a[j];// 調(diào)用比較函數(shù) a: tmp, b: elementvar order = comparefn(tmp, element);if (order > 0) {a[j + 1] = tmp;} else {break;}}a[j + 1] = element;}};/*** some code here **/var QuickSort = function QuickSort(a, from, to) {/*** some code here **/};}function ArraySort(comparefn) {CHECK_OBJECT_COERCIBLE(this, "Array.prototype.sort");var array = TO_OBJECT(this);var length = TO_LENGTH(array.length);return InnerArraySort(array, length, comparefn);}// 源碼我就不放了,大家有興趣研究的話,可以點擊上面的鏈接自行查看代碼分析:


以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!

「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助: